用于从单元阵列中提取子数组的索引规则

时间:2017-09-25 14:41:02

标签: arrays matlab jagged-arrays

我想从单元格数组中提取子单元格数组,但出于某种原因,单元格数组的索引规则不像常规数组那样工作。

例如,

T = cell(4,4);
for i = 1:4
    for j = 1:4
        T{i,j} = [(j-1)*4 + i];
    end    
end

产生

T =

  4×4 cell array

    [1]    [5]    [ 9]    [13]
    [2]    [6]    [10]    [14]
    [3]    [7]    [11]    [15]
    [4]    [8]    [12]    [16]

但是当我从左上角提取一个2x2子阵列时,我得到了

{T{1:2,1:2}}

ans =

  1×4 cell array

    [1]    [2]    [5]    [6]    

为什么我没有获得2x2单元阵列?

我可以重塑数组以获得

reshape({T{1:2,1:2}},2,2)

ans =

  2×2 cell array

    [1]    [5]
    [2]    [6]

但为什么我需要这样做并不明显。 除非我遗漏了某些东西,否则我没有看到将索引规则应用于单元数组的模糊性与它们用于常规数组的方式相同。

最终,我希望能够重新排列块以创建新的单元阵列,即

S = {T{[1 3 4],[1 3 4]}}

除了使用重塑之外,还有更好的方法吗?

注意:有人指出这个问题与this question重复。我没看到那些原帖。也许,如果我只有一维单元阵列,我就不会遇到上面的问题。例如,如果我有

P = {[1],[2],[3],[4]}

然后

{P{1:2}}

P(1:2)

都产生

1×2 cell array

    [1]    [2]

但是,使用上面的T,以下内容有所不同:

{T{1:2,1:2}}

ans =

  1×4 cell array

    [1]    [2]    [5]    [6]

T(1:2,1:2)

ans =

  2×2 cell array

    [1]    [5]
    [2]    [6]

我可能拖延了这一点,但我认为Matlab在使用{}时解开2d单元格阵列是很奇怪的,但在使用()时却没有。我知道{}有时可能意味着一个"列表"而不是结构化数组(可能用作参数列表?)但是可以使用{}(.eg {[1],[2]; [3],[4]}来构造结构化数组,奇怪的是它们不能被索引以互惠的方式。

0 个答案:

没有答案