我知道在MATLAB中,在1D情况下,您可以选择带有索引的元素,例如a([1 5 3])
,以返回a的第1,第5和第3个元素。我有一个2D数组,并希望根据我拥有的一组元组选择单个元素。所以我可能希望获得a(1,3), a(1,4), a(2,5)
等等。目前我所拥有的最好的是diag(a(tuples(:,1), tuples(:,2))
,但是对于较大的a和/或元组,这需要大量的内存。我是否必须将这些元组转换为线性索引,或者是否有更简洁的方法来完成我想要的而不需要占用太多内存?
答案 0 :(得分:6)
转换为线性指数似乎是一种合法的方式:
indices = tuples(:, 1) + size(a,1)*(tuples(:,2)-1);
selection = a(indices);
请注意,这也是在Matlab内置解决方案sub2ind
中实现的,如nate' 2答案:
a(sub2ind(size(a), tuples(:,1),tuples(:,2)))
然而,
a = rand(50);
tuples = [1,1; 1,4; 2,5];
start = tic;
for ii = 1:1e4
indices = tuples(:,1) + size(a,1)*(tuples(:,2)-1); end
time1 = toc(start);
start = tic;
for ii = 1:1e4
sub2ind(size(a),tuples(:,1),tuples(:,2)); end
time2 = toc(start);
round(time2/time1)
给出了
ans =
38
所以尽管sub2ind
在眼睛上更容易,但它也<40倍更慢。如果您经常需要执行此操作,请选择上述方法。否则,请使用sub2ind
来提高可读性。
答案 1 :(得分:3)
如果x和y是矩阵a的x y值的向量,那么sub2und应该可以解决你的问题:
a(sub2ind(size(a),x,y))
例如
α=魔法(3)
a =
8 1 6 3 5 7 4 9 2
x = [3 1];
y = [1 2];
a(sub2ind(size(a),x,y))
ans =
4 1
答案 2 :(得分:0)
您可以使用1D编号引用2D matlab位置,如下所示:
a = [3 4 5;
6 7 8;
9 10 11;];
a(1) = 3;
a(2) = 6;
a(6) = 10;
所以,如果你能在这样的矩阵中得到这些位置:
a([(col1-1)*(rowMax)+row1, (col2-1)*(rowMax)+row2, (col3-1)*(rowMax)+row3])
注意:在这种情况下,rowmax为3
将为您提供col1 / row1 col2 / row2和col3 / row3的元素列表。
所以,如果
row1 = col1 = 1
row2 = col2 = 2
row3 = col3 = 3
你会得到:
[3, 7, 11]
回。