【发布时间】:2015-08-02 14:06:59
【问题描述】:
如果我有一个 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 的方法?
【问题讨论】:
标签: matlab cell-array
如果我有一个 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 的方法?
【问题讨论】:
标签: matlab cell-array
我怀疑你在做什么是这样的:
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 列是一个 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 将等效地返回 1 和 4 作为左上角和右下角元素的列主索引。这避免了sub2ind 调用,仍然可以实现您想要的。
【讨论】: