使用单元格进行Subsref

时间:2013-08-22 15:26:50

标签: matlab subset cell-array matrix-indexing

当我answering this question时出现此问题。这应该是我正在做的一些愚蠢的错误,但我无法得到它的错误......

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 documentation,我们看到:

  

了解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

对于我使用访问myCell的每个索引,我需要使用带有一个输出的subsref,或者我错过了什么?

3 个答案:

答案 0 :(得分:4)

当大括号({})用于索引cell array时,输出为comma-separated list。这隐式调用subsref,但行为与直接调用它略有不同。

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

答案 1 :(得分:1)

不要问我原因,这只是我尝试过的事情:

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

注意'type','()'!

这给了我:

myOutput = 

[2]    [4]

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

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

myOutput =

 2     4

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

答案 2 :(得分: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}A{:}的工作方式类似于Cell.get(),而subsref则作为常见的matlab函数工作,在输出参数时只返回一个参数没有指定,因为C,java,C++中的一个函数会这样做。无论如何,我觉得subsref应该像.get一样工作。