4

我在回答这个问题时出现了这个问题。这应该是我正在做的一些愚蠢的错误,但我无法得到它是什么错误......</p>

myMatrix = [22 33; 44 55]

回报:

>> subsref(myMatrix, struct('type','()','subs',{{[1 2]}} ) );    

ans =

    22    44

与细胞一起使用时:

myCell = {2 3; 4 5} 

回报:

>> subsref(myCell,struct('type','{}','subs',{{[1 2]}} ) );

ans =

     2  % WHATTT?? Shouldn't this be 2 and 4 Matlab??

检查subsref 文档,我们看到:

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

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

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

然后,如果这样做:

>> [a,b]=subsref(myCell,struct('type','{}','subs',{{[1 2]}} ) ) 

a =

     2


b =

     4 % Surprise!

但这与将自动返回的 myCell{[2 4]} 不同:

>> myCell{[1 2]}                                               

ans =

     2


ans =

     4

对于我使用 access 的每个索引,我都需要使用 subsref 和一个输出myCell,或者我错过了什么?

4

3 回答 3

4

When the curly braces ({}) are used for indexing a cell array, the output is a comma-separated list. This implicitly calls subsref but the behavior is slightly different from invoking it directly.

subsref by itself is a technically a function, and the comma-separated list returned by the curly braces simply behaves like varargout in this case. This means that you should specify an appropriate "sink" for all desired output results, just like you would do with any other function returning multiple parameters, otherwise they would be ignored.

于 2013-08-22T16:18:35.660 回答
1

不要问我为什么,这只是我尝试过的:

myOutput=subsref(myCell,struct('type','()','subs',{{[1 2]}} ) )

注意'类型','()'!

这给了我:

myOutput = 

[2]    [4]

以 myOutput 作为单元格。转换回来:

>> myOutput=cell2mat(subsref(myCell,struct('type','()','subs',{{[1 2]}})))

myOutput =

 2     4

这只是一个“快速”的答案,还需要一些改进或一些背景信息......

于 2013-08-22T15:56:02.900 回答
1

我正在进一步调查@EitanH 的答案并设法找到更多细节。

是的,它返回一个逗号分隔的列表,但是该函数subsref应该返回一个逗号分隔的列表A{:}。这是一个示例,其中函数的行为不同,但这是预期的行为,我希望类.get方法返回一个列表,并且一个类通用函数的行为类似于通用函数,仅从单元格中获取第一个参数。

classdef ListReturn

  properties(Access = private)
    a
  end

  properties(Dependent)
    getA
  end

  methods
    function self = ListReturn(a)
      self.a = a;
    end
    function varargout = get.getA(self)
      varargout = {self.a};
    end
    function varargout = getAFcn(self)
      varargout = {self.a};
    end
  end
end

调用函数时有很大的不同,就像 .get 一样:

k=[ListReturn(2) ListReturn(3) ListReturn(4) ListReturn(5)]
>> k.getAFcn

ans =

     2

>> k.getA

ans =

     2


ans =

     3


ans =

     4


ans =

     5

所以看起来使用A{1:2}orA{:}像 a 一样工作Cell.get(),而它subsref作为一个常见的 matlab 函数工作,当未指定输出参数时只返回一个参数,就像一个函数C,java,C++一样。无论如何,我只是觉得subsref应该作为.get.

于 2013-08-22T18:11:45.503 回答