不使用`sub2ind`从矩阵中选择一个向量

时间:2012-02-09 18:58:50

标签: matlab

我有一个5 x 5矩阵M和两个向量

x=[1:5]
y=[1 4 3 5 2]

我想用下标(x,y)提取M的元素,即(1,1),(2,4),(3,3),(4,5),(5,2) 。当然,我可以做类似

的事情
M(sub2ind([5,5],x,y))

但是转换到索引会产生一些开销。还有其他办法吗?

4 个答案:

答案 0 :(得分:3)

MATLAB使用Column Major格式,为什么不利用它? M是5x5 所以, 第一列是M(1),M(2),M(3),M(4),M(5)。 所以,概括一下:

  

M(x,y)= M((x +(y-1)* 5)

答案 1 :(得分:1)

您可以使用匿名函数句柄结合arrayfun方法执行此操作:

% declare an anonymous function which operates on M with args x and y
fun = @(x,y)(M(x,y)); 
% Ask arrayfun to execute "fun" for each pair of x and y.
arrayfun(fun, x, y); 

答案 2 :(得分:1)

不是答案。但由于我感兴趣,我自己进行测试。

M = magic(5)
x=[1:5];
y=[1 4 3 5 2];

%%
tic
for i=1:10000
    out = M(sub2ind([5,5],x,y));
end
toc % Elapsed time is 0.413526 seconds.
out
%%
tic
for i=1:10000
    out = M(x+(y-1)*5);
end
toc % Elapsed time is 0.024004 seconds.
out
%%
fun = @(x,y)(M(x,y)); 
tic
for i=1:10000
    out = arrayfun(fun,x,y);
end
toc % Elapsed time is 0.449727 seconds.
out
%%
fun = @(x,y)(M(x,y)); 
tic
for i=1:10000
    out = nan(1,5);
    for j=1:5
        out(j) = M(x(j),y(j));
    end
end
toc % Elapsed time is  0.045242 seconds.
out

(抱歉第一个程序中有一个愚蠢的复制粘贴错误)

我没有将for循环排除在第二位。

我在2011b - 所以看起来好像很多。

答案 3 :(得分:0)

我认为你的sub2ind方法是最快的。

如果你考虑可读性 - 可以在for循环中阅读。