2012-02-09 61 views
1

我有一個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)) 

但是有一些與索引轉換相關的開銷。還有另一種方法可以做到這一點嗎?

+1

只是做'M(x,y)'不起作用嗎? – hatboyzero 2012-02-09 19:02:54

+0

'diag(M(x,y))'應該可以工作,但我不確定它的效率如何 – groovingandi 2012-02-09 19:15:48

回答

0

我認爲你的sub2ind方法是最快的。

如果您考慮可讀性 - 也許讀for循環。

+0

您的意思是代碼可讀性?我雖然for循環是一個很大的禁忌在matlab數組操作,因爲他們有大量的開銷? – Ivan 2012-02-09 19:17:35

+0

他們表現很差。但是對於調試來說,它們比大多數矢量化結構更容易閱讀。 – bdecaf 2012-02-09 19:21:59

+0

也是用於許多語言的標準構造。令人遺憾的是,他們仍然沒有在matlab中解決這個問題 - 但每個版本都會變得更好。 – bdecaf 2012-02-09 19:25:22

3

MATLAB使用列主要格式,爲什麼不利用它?第一列是M(1),M(2),M(3),M(4),M(5),M是5x5, 因此, 。 所以,歸納如下:

M(X,Y)= M((X +(Y-1)* 5)

+0

我認爲sub2ind可能會更快一點。 – Ivan 2012-02-09 19:16:44

+0

沒有。我反覆測試它。 '>> 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

+2

'sub2ind'基本上是一樣的,只是與錯誤檢查,泛化等相關的開銷。看看'sub2ind.m'。 – yuk 2012-02-09 19:52:43

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); 
+0

+1 - 創意。但是應該有一些開銷,比如最初的方法,甚至更多。 – 2012-02-10 08:32:13

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 

(對不起,在第一個程序中有一個愚蠢的複製粘貼錯誤)

我沒有exxt for循環出來第二。

我在2011b - 所以看起來好多了。

+0

在那些時間.. * BARF * – BAR 2013-07-18 01:35:01