通过两个向量不成对地访问单元阵列

时间:2015-05-21 04:38:48

标签: matlab cell-array

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

我希望A(v,c)只返回A {1,1}和A {2,2},但matlab返回两者的每个组合(也称为返回A {1,2}和A {2, 1})。

有没有办法不使用循环或cellfun?

1 个答案:

答案 0 :(得分:1)

我怀疑你在做什么是这样的:

B = A(v, c);

当您指定要转换为A的矢量时,它会找到交点坐标并为您提供这些元素。因此,通过索引,您基本上可以返回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列是2s的2 x 2矩阵,第2行第1列是所有3s的2 x 2矩阵,最后一个是所有4s的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等效地返回1和4作为左上角和右下角元素的列主要索引。这样可以避免sub2ind调用,但仍能达到您想要的效果。