通过两个向量而不是成对访问元胞数组
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
调用并且仍然实现了你想要的。
如果我有一个元胞数组 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
调用并且仍然实现了你想要的。