通过两个向量而不是成对访问元胞数组

access cell array by two vector not pairwise

如果我有一个元胞数组 2*2,其中 A{i,j} 是一个矩阵,并且我有两个向量 v=1:2,c=1:2。

我希望 A(v,c) 到 return 只有 A{1,1} 和 A{2,2} 但 matlab return 是两者的每个组合(又名 returns A{1,2} 和 A{2,1})。

有没有不使用循环或 cellfun 的方法?

我怀疑你正在做的是这样的事情:

B = A(v, c);

当您指定要索引到 A 的向量时,它会找到坐标的 交点 并为您提供这些元素。因此,通过索引,您基本上 returning A.

中的所有元素

如果您只需要左上角和右下角的元素,请改用 sub2ind。您可以获取元胞数组中这些位置的列主索引,然后使用这些索引切入您的元胞数组:

ind = sub2ind(size(A), v, c);
B = A(ind);

例子

让我们创建一个示例 2 x 2 元胞数组:

A = cell(2,2);
A{1,1} = ones(2);
A{1,2} = 2*ones(2);
A{2,1} = 3*ones(2);
A{2,2} = 4*ones(2);

第 1 行第 1 列是全 1 的 2 x 2 矩阵。第 1 行,第 2 列是 2 的 2 x 2 矩阵,第 2 行第 1 列是所有 3 的 2 x 2 矩阵,最后一个条目是所有 4 的 2 x 2 矩阵。

v = 1:2; c=1:2;、运行 上面的代码给我们:

>> celldisp(B)

B{1} =

     1     1
     1     1

B{2} =

     4     4
     4     4

如您所见,我们准确地挑选出了左上角和右下角的条目。

小注

如果它真的只是一个 2 x 2 的元胞数组,而你只想挑出左上角和右下角的元素,你可以这样做:

B = A([1 4]);

sub2ind 相当于 return 1 和 4 作为左上角和右下角元素的列主索引。这避免了 sub2ind 调用并且仍然实现了你想要的。