带单元格的子引用

Wer*_*ner 5 matlab subset cell-array matrix-indexing

这个问题是我在回答这个问题的时候出现的。这应该是我正在做的一些愚蠢的错误,但我无法得到它是什么错误\xe2\x80\xa6

\n\n
myMatrix = [22 33; 44 55]\n
Run Code Online (Sandbox Code Playgroud)\n\n

返回:

\n\n
>> subsref(myMatrix, struct(\'type\',\'()\',\'subs\',{{[1 2]}} ) );    \n\nans =\n\n    22    44\n
Run Code Online (Sandbox Code Playgroud)\n\n

将其与细胞一起使用时:

\n\n
myCell = {2 3; 4 5} \n
Run Code Online (Sandbox Code Playgroud)\n\n

返回:

\n\n
>> subsref(myCell,struct(\'type\',\'{}\',\'subs\',{{[1 2]}} ) );\n\nans =\n\n     2  % WHATTT?? Shouldn\'t this be 2 and 4 Matlab??\n
Run Code Online (Sandbox Code Playgroud)\n\n

检查subsref 文档,我们看到:

\n\n
\n

查看 MATLAB 如何调用表达式的 subsref:

\n\n

A{1:2} 语法 A{1:2} 调用 B = subsref(A,S),其中 S.type=\'{}\' 和\n S.subs={[1 2]}。

\n
\n\n

这似乎不正确,因为 subsref 返回的值只是第一个参数,而不是所有参数。

\n\n

那么如果有人这样做:

\n\n
>> [a,b]=subsref(myCell,struct(\'type\',\'{}\',\'subs\',{{[1 2]}} ) ) \n\na =\n\n     2\n\n\nb =\n\n     4 % Surprise!\n
Run Code Online (Sandbox Code Playgroud)\n\n

但这与 myCell{[2 4]} 不同,后者会自动返回:

\n\n
>> myCell{[1 2]}                                               \n\nans =\n\n     2\n\n\nans =\n\n     4\n
Run Code Online (Sandbox Code Playgroud)\n\n

我需要对我使用的每个索引使用 subsref 和一个输出 access myCell,还是我遗漏了一些东西?

\n

Eit*_*n T 4

当花括号 ( {}) 用于索引元胞数组时,输出是逗号分隔的列表。这会隐式调用subsref,但行为与直接调用它略有不同。

subsref从技术上讲,它本身就是一个函数,大括号返回的逗号分隔列表的行为就像varargout在这种情况下一样。这意味着您应该为所有所需的输出结果指定适当的“接收器”,就像您对返回多个参数的任何其他函数所做的那样,否则它们将被忽略。