【问题标题】:Difference between x(1) and x{1}x(1) 和 x{1} 之间的差异
【发布时间】:2017-03-02 10:46:07
【问题描述】:
>> x = {  {'a',[1],[2]};  {'b',[3],[4]}  }
x =    
    {1x3 cell}
    {1x3 cell}

>> A1 = x(1)    
A1 =     
    {1x3 cell}

>> A2 = x{1}   
A2 =    
    'a'    [1]    [2]

请注意,A1A2 的显示方式不同。

A1A2 报告为相同的类和维度:

>> info = @(x){class(x),size(x)};
>> info(A1)     
ans =    
    'cell'    [1x2 double]

>> info(A2)     
ans =     
    'cell'    [1x2 double]

然而他们并不被认为是平等的:

>> isequal( A1, A2 )    
ans =    
     0

然而,A1{:}被认为是等于A2

>> isequal( A1{:}, A2 )    
ans =    
     1

有人能解释一下这里发生了什么吗?

【问题讨论】:

  • 这不是Documentation覆盖的吗?
  • 标题如我所愿。 x[] 访问是非法的。
  • 这不是“非法的”。它是未定义的。
  • 如果其中一个答案对您有用,请考虑将其标记为已接受(如果没有答案,请留下一些 cmets)。

标签: matlab matrix indexing cell


【解决方案1】:

() 用于函数输入和索引数组; [] 用于表示数组; {} 用于索引单元格。

A = [2 1]; % Creates and array A with elements 2 and 1
A(2) =2; % Sets the second element of A to 2
B = cell(1,2); % creates a cell array
B{2} = A; % Stores A in the second cell of B

总之:x(1) 选择数组x 的第一个元素或在1 处评估函数xx[1] 应该是不可能的,因为方括号不能用于索引内容; x{1} 将选择元胞数组x 中的第一个元胞。

关于你的具体问题:

A1 = x(1); % makes a copy of the element on index one, being a 1x3 cell
A2 = x{1}; % stores the content of the cell at element 1 in A2

最后A1{:} 将单元格的内容从单元格中取出,准备存储为单独的变量,因此它等于已经包含该内容的A2。 (A1{:}comma separated list,感谢 rayryeng 指出这一点。)

【讨论】:

【解决方案2】:

您的变量x 是一个单元格,其中包含 2 个(子)单元格

  1. 花括号用于获取单元格的内容,因此,

    A2 = x{1}
    ans = 
       'a'    [1]    [2]
    

    结果与

    相同
    A2 = {'a',[1],[2]}
    
  2. 括号用于索引,因此返回 子集 (子)细胞

    A1 = x(1)    
    A1 =     
        {1x3 cell}
    

    结果与

    相同
    A1 = { {'a',[1],[2]} }
    

您的匿名信息函数返回一个单元格(需要,因为内容是混合类型)。结果

'cell'    [1x2 double]

告诉 A1 和 A2 都是单元格,这是正确的,不考虑 A1 是包含单元格的单元格而 A2 是包含一个字符和 2 个数字的单元格这一事实。

[1x2 double] 简单地告诉我们大小的答案是它本身的大小为 [1x2]。只要您不使用高于 2 的维度,这是正确的。

如果您深入了解您的info 答案,您将看到实际大小:

A1info = info(A1);
A2info = info(A2);
A1info{2}
ans =
     1     1
A2info{2}
ans =
     1     3

isequal( A1, A2 )beeingfalse的部分我想你现在明白了。

另外,isequal( A1{:}, A2) 是真的,因为 {:} "de-cell" A1 并挑选出它的内容。 在这种情况下,您也可以输入 isequal( A1{1}, A2)

【讨论】:

    【解决方案3】:

    data{1} 用于访问单元格的内容 data(1) 是创建一个单元格,其中包含第一个数据条目的副本。这与:

    >> A1=cell(1,1);
    >> A1{1}=data{1};
    

    因此,在您的示例中,A1 是一个包含一个单元格的单元格,而 A2 是一个包含三个条目的单元格

    【讨论】:

    • 所以我猜每当 MatLab 的 ans 是一个 1x1 单元格时,显示的是该单元格的 内容。就为什么两种形式显示相同而言,这两个答案都没有。
    • @Pi MATLAB 显示与数据类型关系不大。有时它会显示整个东西,有时只是给你尺寸,这取决于它是否适合屏幕
    猜你喜欢
    • 1970-01-01
    • 2021-01-24
    • 2021-11-28
    • 1970-01-01
    • 1970-01-01
    • 2015-08-09
    • 2012-10-06
    • 1970-01-01
    • 2021-10-07
    相关资源
    最近更新 更多