当我重载 subsref(下标引用)时,为什么 MATLAB 会抛出“输出参数过多”错误?

2024-03-03

As a 玩具示例,我有一个类,它只是将向量或矩阵包装在对象中,并包含创建它的时间戳。我正在尝试超载subsref以便

  1. ()引用的工作方式与标准向量和矩阵类型完全相同
  2. {}参考作品于exactly同样的方式()引用(换句话说,与单元格无关)
  3. .引用允许我访问private对象的属性和其他在技术上不是属性的字段。

Code:

classdef TimeStampValue

    properties (Access = private)
        time;
        values;
    end

    methods
        %% Constructor
        function x = TimeStampValue(values)
            x.time = now();
            x.values = values;
        end

        %% Subscripted reference
        function x = subsref(B, S)
            switch S.type
                case '()'
                    v = builtin('subsref', B.values, S);
                    x = TimeStampValue(v);
                case '{}'
                    S.type = '()';
                    v = builtin('subsref', B.values, S);
                    x = TimeStampValue(v);
                case '.'
                    switch S.subs
                        case 'time'
                            x = B.time;
                        case 'values'
                            x = B.values;
                        case 'datestr'
                            x = datestr(B.time);
                    end
            end
        end

        function disp(x)
            fprintf('\t%d\n', x.time)
            disp(x.values)
        end   

    end

end

不过撑起{}引用不起作用。我运行这段代码

clear all
x = TimeStampValue(magic(3));
x{1:2}

我收到此错误:

Error using TimeStampValue/subsref
Too many output arguments.
Error in main (line 3)
x{1:2} 

MException.last给我这个信息:

identifier: 'MATLAB:maxlhs'
   message: 'Too many output arguments.'
     cause: {0x1 cell}
     stack: [1x1 struct]

这没有帮助,因为异常堆栈中唯一的东西是包含我上面运行的三行代码的文件。

我在 switch 语句的第一行放置了一个断点subsref但 MATLAB 却从未达到这个目标。

这是怎么回事?两个都() and .正如您所期望的那样引用工作,那么为什么不呢{}参考工作?


当花括号过载时{}要返回与平常不同数量的输出参数,还需要重载numel返回预期的数字(在本例中为 1)。UPDATE: As of R2015b,新函数numArgumentsFromSubscript https://www.mathworks.com/help/matlab/ref/numargumentsfromsubscript.html被创建为重载而不是numel。问题仍然相同,但应该重载该函数而不是numel正如我在下面的原始答案中所描述的。另请参阅页面“修改索引方法的 nargout 和 nargin” https://www.mathworks.com/help/matlab/matlab_oop/overloading-numel-subsref-and-subsasgn.html。摘抄:

当一个类超载时numArgumentsFromSubscript,MATLAB 调用此方法而不是numel计算预期的参数数量subsref nargout and subsasgn nargin.

如果类没有超载numArgumentsFromSubscript, MATLAB 调用numel计算的值nargout or nargin.

下面是对根本问题的更多解释(需要指定输出参数的数量)。


原始答案(使用numArgumentsFromSubscript代替numel对于 R2015b+)

为了处理使用大括号索引时逗号分隔的输出参数列表的可能性,MATLAB 调用numel根据输入索引的大小确定输出参数的数量(根据这个 MathWorks 答案 http://www.mathworks.com/matlabcentral/answers/101955#answer_111302)。如果重载定义中的输出参数数量subsref与提供的数字不一致(即小于)numel,您会收到“输出参数太多”错误。正如 MathWorks 所说:

因此,为了允许在对象中使用大括号索引,同时返回与输入大小不一致的参数数量,您需要在类目录中重载 NUMEL 函数。

Since x{1:2}通常提供两个输出(X{1},X{2}), 定义function x = subsref(B, S)与此输入不兼容。解决方案是在类中包含一个简单的numel方法重载内置函数,如下:

function n = numel(varargin)
    n = 1;
end

Now the {}索引按预期工作,模仿():

>> clear all % needed to reset the class definition
>> x = TimeStampValue(magic(3));
>> x(1:2)
ans = 
    7.355996e+05
     8     3
>> x{1:2}
ans = 
    7.355996e+05
     8     3

然而,以这种方式重载花括号是显然 http://www.mathworks.com/matlabcentral/answers/101955#answer_111302“我们 [MathWorks] 不希望客户编写的特定类型的代码”。 MathWorks 建议:

如果您将类设计为仅输出一个参数,则不建议您使用需要重载 NUMEL 的大括号索引。相反,建议您使用平滑大括号 () 索引。

UPDATE:有趣的是,R2015b 发行说明状态 https://www.mathworks.com/help/matlab/release-notes.html#bu0biit-3:

在 MATLAB 发布 R2015b 之前,MATLAB 错误地计算了输出的预期参数数量subsref并输入subsasgn对于某些返回或分配给逗号分隔列表的索引表达式。

在 R2015b 版本中,MATLAB 可以正确计算nargout and nargin根据索引表达式所需的参数数量。

那么也许这个问题现在已经解决了?


我想到的另一种解决方案是改变function x = subsref(B, S) to function varargout = subsref(B, S)并添加varargout=cell(1,numel(B)); varargout{1} = x;。正如 Amro 在评论中指出的那样,必须预先分配单元格,以避免出现有关未分配参数的错误。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

当我重载 subsref(下标引用)时,为什么 MATLAB 会抛出“输出参数过多”错误? 的相关文章

  • 图像增强 - 从书写中清除给定图像

    我需要清理这张照片 删除 清理我 的字样并使其变亮 作为图像处理课程作业的一部分 我可能会使用 matlab 函数 ginput 来查找图像中的特定点 当然 在脚本中您应该对所需的坐标进行硬编码 您可以使用 conv2 fft2 ifft2
  • 类运算符

    我在编写代码时遇到问题 void main Matrix c rows cols rows cols are int numbers c 0 0 2 the line that I m having a problem to do the
  • Microsoft Visual C++ 2008 和 R2007b 的 Mex 类型

    我想对 vs2008 和 matlab2007b 使用 mex 类型 我尝试了下面的代码 include
  • 如何选择部分密集数据集的均匀分布子集?

    P是一个 n d 矩阵 持有nd 维样本 P某些地区的密度是其他地区的几倍 我想选择一个子集P其中任意样本对之间的距离大于d0 并且我需要将其传播到整个区域 所有样本都具有相同的优先级 无需优化任何内容 例如覆盖面积或成对距离之和 这是执行
  • matlab矩阵中求子矩阵的通用方法

    我正在寻找一种 好 方法来在更大的矩阵 任意维数 中找到矩阵 模式 Example total rand 3 4 5 sub total 2 3 1 3 3 4 现在我希望这样的事情发生 loc matrixFind total sub 在
  • 使用 java 执行 Matlab 函数

    我正在编写一个应用程序 它使用 matlab 进行图像处理 然后使用 Java 接口显示结果 由于某些原因 我必须同时使用 Java 和 Matlab 如何在java中使用matlab函数 如何创建和访问界面 MATLAB控制 http m
  • 将组合字符串和数字输入的元胞数组写入文本文件

    考虑以下 DateTime 2007 01 01 00 00 2007 02 01 00 00 2007 03 01 00 00 Headers Datetime Data Dat 100 200 300 Data DateTime num
  • 删除重载、递归溢出

    嘿伙计们 我写了一个快速测试 我想删除调用deleteMe 然后它会自行删除 这样做的目的是让我可以正常删除由lib分配的obj 我不希望因 crt 或 w e 导致任何崩溃 通过删除这个 我得到了一个堆栈溢出 没有它 msvc 说我泄漏了
  • 在 MATLAB 中用两个值替换向量值

    我必须创建一个以向量作为输入的函数v和三个标量a b and c 该函数替换了的每个元素v等于a有一个二元素数组 b c 例如 给定v 1 2 3 4 and a 2 b 5 c 5 输出将是 out 1 5 5 3 4 我的第一次尝试是尝
  • 类方法的自定义代码完成?

    在 MATLAB 中 可以定义代码建议和完成 如标题为 的文档页面中所述 自定义代码建议和完成 https www mathworks com help matlab matlab prog customize code suggestio
  • 实现数学函数的乘法运算符 C++

    我有以下抽象基类 class Function virtual double Eval double x const 0 我希望能够使用 f g 或 f gt operator g 等表达式 其中 f 和 g 是类 Function 的具体
  • 通过傅里叶空间填充进行插值

    我最近尝试在 matlab 上实现一个在傅立叶域中使用零填充的插值方法的简单示例 但我无法正常工作 我总是有一个小的频移 在傅里叶空间中几乎不可见 但它在时空上产生了巨大的误差 由于傅里叶空间中的零填充似乎是一种常见 且快速 的插值方法 因
  • 运算符可以用作函数吗? (C++)

    这与我问过的另一个问题类似 但是 我创建了一个表达式类 其工作方式如下 expression
  • 频域和空间域的汉明滤波器

    我想通过在 MATLAB 中应用汉明滤波器来消除一维信号中的吉布斯伪影 我所拥有的是k1这是频域中的信号 我可以通过应用 DFT 来获取时域信号k1 s1 ifft ifftshift k1 该信号具有吉布斯伪影 现在 我想通过 A 乘以汉
  • 使用 R2010b 中的符号工具箱来求解和/或 linsolve

    我前几天问了一个问题here https stackoverflow com questions 20317038 matlab linear congruence solver that supports a non prime modu
  • 重载逻辑运算符 && 和 ||从 C++17 开始短路?

    我读到http en cppreference com w cpp language operators http en cppreference com w cpp language operators 布尔逻辑运算符 运算符 和运算符
  • MATLAB 可执行文件太慢

    我使用以下命令将 MATLAB 程序转换为基于控制台的应用程序deploytool在 MATLAB 中 MATLAB m文件执行大约需要 2 秒 但在我将其转换为可执行文件并调用 exe 执行需要45秒 太长了 我想将 MATLAB 程序与
  • 将数据提示堆栈放在轴标签顶部,并在轴位置发生更改后更新轴标签

    此问题仅适用于 unix matlab Windows 用户将无法重现该问题 我在尝试创建位于 y 轴标签顶部的数据提示时遇到问题 下图很能说明问题 正如您所看到的 在 ylabel 附近创建的数据提示将到达 ylabel 文本的底部 而期
  • 如何在向量中的所有点之间绘制线?

    我有一个包含二维空间中一些点的向量 我希望 MATLAB 用从每个点到每个其他点绘制的线来绘制这些点 基本上 我想要一个所有顶点都连接的图 你能用情节来做到这一点吗 如果可以 怎么做 一种解决方案是使用该函数为每个点组合创建一组索引MESH
  • 在 matlab 代码中使用 dll 文件

    我需要使用 Matlab 中由 dll 文件定义的函数 我有一个例子 那个家伙将 dll 转换为 mexw32 文件 但我知道我是如何做到这一点的 我尝试使用加载库但它没有创建任何文件 我怎样才能做到这一点 loadlibrary http

随机推荐

  • TemplateDoesNotExist 位于/base/index.html

    我正在学习 Django 并正在构建一个登陆页面 我收到 TemplateDoesNotExist 错误 我想我知道原因 但我不知道如何解决此问题 我的index html is in coffeedapp coffeedapp templ
  • NSURLSessionUploadTask 未将文件传递给 php 脚本

    编辑 好的 我只是将内容类型标头设置为 multipart form data 没有区别 我原来的问题如下 这是我关于堆栈溢出的第一个问题 我希望我做得对 我刚刚学习 Objective C 最近完成了斯坦福大学在线版本的课程 我对 php
  • php 中的电子邮件 div 内容

    是否可以获取特定下的内容 div 并通过电子邮件发送该内容 例如 如果我有这样的事情 div ul li a li li b li ul ul ul div 基本上我只想参考 div 并获取全部内容并通过电子邮件发送 有什么办法可以缓存di
  • 如何在 WebView 中处理基本身份验证

    我创建了一个加载 WebView 的应用程序 为了登录 该网站需要基本身份验证 当我尝试访问该网站时 通过默认浏览器 我会收到一个弹出框 提示我输入我的用户名 和密码 如果我尝试通过我的应用程序访问该网站 我会收到错误 401 并且没有弹出
  • 尝试启动 docker 时不断出现无法读取 CA 证书

    我正在尝试从 boot2docker 迁移到 docker machine 我按照指示进行操作here http docs docker com mac step one 安装 docker 但我不断收到以下消息 Could not rea
  • 初始化逻辑(例如大量单例)应该在 OnCreate 还是 OnResume 中吗?

    假设我有一个带有通用定位控制器 电池控制器 AppSateController 等 inilizations 方法的单例 这些是否应该在 onResume 中而不是 OnCreate 中 因为 OnCreate 在每次旋转 每次更改为前台时
  • 如何通过javascript访问数据库?

    我正在创建一个管理页面 其中有多个文本框 当我在一个文本框中输入用户 ID 时 我想在管理员移动到下一个文本框时在下一个文本框中显示用户名 为此我可以使用ajax or javascript 哪一个会更好 我怎样才能通过javascript
  • Angular,内容类型未通过 $http 发送

    Angular 没有添加正确的内容类型选项 我尝试了以下命令 http url http localhost 8080 example teste dataType json method POST headers Content Type
  • 注意:第 18 行 C:\Program Files (x86)\EasyPHP-Devserver-17\eds-dashboard\index.php 中的未定义偏移量:3

    我安装了 EasyPHP deverser 17 并且运行良好几个月了 今天 没有任何原因 我的意思是没有更改任何内容 我在打开仪表板时收到以下错误消息 注意 第 18 行 C Program Files x86 EasyPHP Devse
  • “警告:链接共享库与静态库不可移植”是什么意思?

    我正在使用 libmxml a 库的某些函数来创建一个动态库 但我收到此警告 Warning Linking the shared library libgstmatroskademux la against the static libr
  • 实体框架断开连接的图形和导航属性

    我正在使用 Entity Framework 6 Code First 和 Fluent API 我在 Visit 和 VisitPage 之间有一对多关系 1 个 Visit 有许多 VisitPage 对象 这是 POCO 类的简化版本
  • 从 XML 文件中删除标头的简单方法

    我需要从另一个程序生成的文件中删除非 xml 标签 该文件是这样的 Executing Command Blah exe Command Output HTTP 1 1 200 OK Connection close Content Typ
  • Mysql语句(FULL JOIN语法错误)

    我的 sql 语句出了什么问题 它说问题出在 FULL JOIN 附近 但我很困惑 SELECT o name AS offername m name AS merchantName FROM offer AS o FULL JOIN of
  • 如何在没有虚拟化的 Macintosh 上进行“干净”测试?

    我在 Windows 上遇到的一件事是 当您正在开发的 Web 浏览器插件或程序假设安装了默认情况下并不总是存在于 Windows 上的某些内容时 一个完美的例子是 NET 很多运行 Windows XP 的人从未安装过任何版本的 NET
  • 更改列表视图中的颜色线

    如何更改列表视图中的颜色线 例如if line 4 then line is red 如果您想浏览整个列表并有条件地为每个项目着色 那么您可以使用 foreach ListViewItem lvw in myListView Items i
  • Jquery ui - 自动完成 - UTF8 字符集

    我正在处理这个 jquery 数据输入表单 其中我需要使用来自 mysql 的数据自动完成特定字段 我一切正常 自动完成通过 php 从 sql 检索数据 英语 拉丁字符的匹配非常好 问题是 当我输入希腊语时 我只得到区分大小写的匹配项 如
  • 如何在 git 中共享配置文件?

    我有想要在所有存储库中传播的编辑器设置 如果用户定义了自己的设置 那么它当然应该删除存储库选择 我想这样做 因为我有一个班级 每个学生都克隆该存储库 通常他们会忘记设置 core editor 设置并最终乱搞 vi 通常会导致仓库崩溃 就像
  • 压缩图像和调整图像大小有什么区别?安卓

    在我的 Android 应用程序中 我想将图像上传到服务器 解决服务器不接受大于2M图片的问题 但用户可以选择大于2M的图片 所以我想构建一个代码 使图像小于2M 我有两种方法 调整图像尺寸 如下 public static Bitmap
  • 在 Haskell 中重新排序类型参数

    我有一个关于类型参数的问题 我认为最好通过示例来表达 这段代码 newtype Triple a b c T a b c instance Functor Triple a b where fmap f T x y z T x y f z
  • 当我重载 subsref(下标引用)时,为什么 MATLAB 会抛出“输出参数过多”错误?

    As a 玩具示例 我有一个类 它只是将向量或矩阵包装在对象中 并包含创建它的时间戳 我正在尝试超载subsref以便 引用的工作方式与标准向量和矩阵类型完全相同 参考作品于exactly同样的方式 引用 换句话说 与单元格无关 引用允许我