在MATLAB中从数组中选择元素

时间:2012-10-23 05:17:48

标签: arrays matlab indexing

我知道在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和/或元组,这需要大量的内存。我是否必须将这些元组转换为线性索引,或者是否有更简洁的方法来完成我想要的而不需要占用太多内存?

3 个答案:

答案 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]

回。