我有一個5×5的矩陣M和兩個向量選擇從矩陣的向量,而不使用`sub2ind`
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))
但是有一些與索引轉換相關的開銷。還有另一種方法可以做到這一點嗎?
我有一個5×5的矩陣M和兩個向量選擇從矩陣的向量,而不使用`sub2ind`
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))
但是有一些與索引轉換相關的開銷。還有另一種方法可以做到這一點嗎?
MATLAB使用列主要格式,爲什麼不利用它?第一列是M(1),M(2),M(3),M(4),M(5),M是5x5, 因此, 。 所以,歸納如下:
M(X,Y)= M((X +(Y-1)* 5)
我認爲sub2ind可能會更快一點。 – Ivan 2012-02-09 19:16:44
沒有。我反覆測試它。 '>> a = rand(5000,5000); >> x = 1:5000; >> y = randperm(5000);>> tic; p2 = a(x +(y-1)* 5000); toc; 已用時間爲0.000732秒。 >> tic; p = a(sub2ind([5000,5000],x,y)); toc; 已用時間爲0.001371秒。 ' – 2012-02-09 19:22:41
'sub2ind'基本上是一樣的,只是與錯誤檢查,泛化等相關的開銷。看看'sub2ind.m'。 – yuk 2012-02-09 19:52:43
你可以做到這一點使用匿名函數處理結合的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);
+1 - 創意。但是應該有一些開銷,比如最初的方法,甚至更多。 – 2012-02-10 08:32:13
不是一個答案,但因爲我是有興趣的我跑我自己的測試
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
(對不起,在第一個程序中有一個愚蠢的複製粘貼錯誤)
我沒有exxt for循環出來第二。
我在2011b - 所以看起來好多了。
在那些時間.. * BARF * – BAR 2013-07-18 01:35:01
只是做'M(x,y)'不起作用嗎? – hatboyzero 2012-02-09 19:02:54
'diag(M(x,y))'應該可以工作,但我不確定它的效率如何 – groovingandi 2012-02-09 19:15:48