- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
作为一个玩具示例,我有一个简单地将向量或矩阵包装在对象中并包含其创建时间的时间戳的类。我正在尝试重载 subsref
以便
()
引用的工作方式与标准向量和矩阵类型完全相同{}
引用在中的工作方式与 ()
引用相同(换句话说,与单元格无关).
引用允许我访问对象的私有(private) 属性和技术上不属于属性的其他字段。 代码:
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]
这没有帮助,因为异常堆栈中唯一的东西是包含我在上面运行的三行代码的文件。
我在 subsref
中 switch 语句的第一行放置了一个断点,但 MATLAB 从未到达它。
这是怎么回事? ()
和 .
引用都按您预期的方式工作,那么为什么 {}
引用不起作用?
最佳答案
当重载花括号 {}
以返回与平时不同数量的输出参数时,还需要重载 numel
以返回预期的数字 (1,在这种情况下)。 更新:自 R2015b 起,创建了新函数 numArgumentsFromSubscript
以重载,而不是 numel
。问题仍然存在,但是应该重载此函数而不是 numel
,正如我在下面的原始答案中所描述的那样。另请参阅页面 "Modify nargout and nargin for Indexing Methods" 。摘录:
When a class overloads
numArgumentsFromSubscript
, MATLAB calls this method instead ofnumel
to compute the number of arguments expected forsubsref
nargout
andsubsasgn
nargin
.If classes do not overload
numArgumentsFromSubscript
, MATLAB callsnumel
to compute the values ofnargout
ornargin
.
下面是对潜在问题的更多解释(需要指定输出参数的数量)。
原始答案(使用 numArgumentsFromSubscript
而不是 R2015b+ 的 numel
)
为了在使用花括号进行索引时处理逗号分隔的输出参数列表的可能性,MATLAB 调用 numel
以根据输入索引的大小确定输出参数的数量(根据 this MathWorks answer ) .如果重载 subsref
定义中的输出参数数量与 numel
提供的数量不一致(即小于),则会出现“输出参数过多”错误.正如 MathWorks 所述:
Therefore, to allow curly brace indexing into your object while returning a number of arguments INCONSISTENT with the size of the input, you will need to overload the NUMEL function inside your class directory.
由于 x{1:2}
通常提供两个输出 (X{1},X{2}
),定义 function x = subsref( B, S)
与此输入不兼容。解决方案是在类中包含一个简单的 numel
方法来重载内置函数,如下所示:
function n = numel(varargin)
n = 1;
end
现在 {}
索引按预期工作,模仿 ()
:
>> 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
但是,以这种方式重载花括号是 apparently 一种“我们 [MathWorks] 不希望客户编写的特定类型的代码”。 MathWorks 建议:
If you are designing your class to output only one argument, it is not recommended that you use curly brace indexing that requires you to overload NUMEL. Instead, it is recommended you use smooth brace () indexing.
更新:有趣的是,R2015b release notes state:
Before MATLAB release R2015b, MATLAB incorrectly computed the number of arguments expected for outputs from
subsref
and inputs tosubsasgn
for some indexing expressions that return or assign to a comma-separated list.With release R2015b, MATLAB correctly computes the values of
nargout
andnargin
according to the number of arguments required by the indexing expression.
所以也许现在这个问题已经解决了?
想到的另一种解决方案是将 function x = subsref(B, S)
更改为 function varargout = subsref(B, S)
并添加 varargout=cell(1,numel(B)); varargout{1} = x;
.正如 Amro 在评论中指出的那样,预先分配单元格对于避免有关未分配参数的错误是必要的。
关于matlab - 为什么当我重载 subsref(下标引用)时 MATLAB 会抛出 "too many output arguments"错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20863050/
是否可以创建一个可以使用显式参数标签调用的下标? struct MyType { subscript (label: Bool) -> String? { return nil
我正在尝试制作一个包含带有上标和/或下标的文本的超链接。我找到了两种方法来做到这一点,它们都很糟糕。 解决方案#1:使用 Typography.Variants .这为某些字体提供了极好的上标……。
在这里! 我想在 geom_bracket 中包含一个带下标的标签在 ggplot2 .我尝试了不同的方式,但没有人成功(评论中的尝试): library(ggplot2) ggplot(data =
我正在尝试让 graphviz 启动并工作,我迫切需要节点标签中的下标。不幸的是,通过浏览无数关于类似问题的帖子,我似乎适合所有建议的解决方案,但仍然不起作用。这是我的代码: digraph G{
抱歉格式问题,我从来没有真正在这样的论坛上发帖,所以我必须学习一下操作方法。 我的问题是:我正在编写一个模板类,我想通过多种 [] 运算符访问我的容器。我读了一些关于这个主题的内容,所以我已经能够重载
我知道我们可以像在 matplotlib 中生成单个下标 $r_i$ 会给我一个下标为“i”的r。 但我想生成一个包含 3 或 4 个字母的下标,例如 r_ijk 应该给我一个带有“ijk”作为下标的
this[5] 有什么作用?我是否调用了某种未定义的行为?关于: std::vector foo{this, this + 5u}; 这个有用吗?我想知道指针算法对 this 的影响是什么。这是一个测
我从 visual studio 得到了一些奇怪的行为,关于以下代码片段,错误列表显示了 E0349 的几个实例:没有运算符“[]”匹配这些操作数。 Intellisense 似乎暗示类型不匹配,但正
我想为我的数组类提供 PHP 样式的 push_back 功能: arrayT arr; arr[] = 10; // == std::vector::push_back() 和 arrayT::op
下标 (subscripts)可以定义在类(class)、结构体(structure)和枚举(enumeration)中,是访问集合(collection),列表(list)或序列(sequence)
我正在使用traindata训练svm。 (R中的e1071软件包)。以下是有关我的数据的信息。 > str(train) 'data.frame': 891 obs. of 10 variab
#include int main(){ int arr[7] = {0,1,2,3,4,3,2}; arr[0]++[arr]++[arr]++[arr]++[arr]++[arr]
如果我想以特定用户的身份调用主脚本文件中的另一个 shell 脚本,我该怎么做呢?子脚本似乎失去了它正在运行的用户的上下文,我还没有找到任何有用的子脚本技术。 例如:war-install.sh if
这个问题在这里已经有了答案: Why isn't there an operator[] for a std::list? (4 个答案) 关闭 5 年前。 我有这些类型定义: typedef pa
我在 NSUserdefaults 中获取字典的字符串时遇到问题,这是我的代码。我不知道似乎是什么问题: static func getItemInUserDefaultsDictionary(key
我正在尝试执行以下代码并收到错误 Could not find member 'subscript on Xcode6 var b:[[Float]] = [[1,2]] var i2 = 0 //
我尝试运行的代码: std::string genBlankName(std::vector &posts) { std::string baseName = "New Post ";
1 1 A_{3} 2 2 C_{2} 3 3 ^{5}C_{1} 我有一个这样的输入文件要绘制。第三列是该点上的标签( latex 格式)。我如何在绘图上显示这些标签,就像它们在 latex 编译后
我在这里搜索了一段时间,之前的问题/答案部分回答了我的问题。我正在学习 R,来自 Matlab。正如标题所说,我有一个关于情节注释的问题。在 Matlab 中,绘制包含各种数据格式的注释非常简单,我正
我想将一些化学数据放入表格的列中。但在现有表格中,下标显示为普通字符。其中一些显示为问号。我应该怎么做才能解决它? 当我输入这段代码时 SELECT N'H' + NCHAR(0x2082) + N
我是一名优秀的程序员,十分优秀!