我有一个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))
但是转换到索引会产生一些开销。还有其他办法吗?
答案 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循环中阅读。