2016-05-02 54 views
3

我想用MATLAB中的單個for循環來實現BlockLMS。爲了這個目的,在給定矢量ü,我試圖創建表格在MATLAB中對整形矢量進行整形

U = [u(k)  u(k+1)  u(k+2) ... u(k+n) 
    u(k-1) u(k)  ...  ... u(k+n-1) 
    ...  ...  ...  ... ... 
    u(k-n) u(k-n+1) ...  ... u(k)] 

其中Ñ是常數,並且ķ的表是與每一個用於循環變化的變量,假設k > n在任何時候。到目前爲止我所完成的是:

index = meshgrid(0:-1:1-n)' + meshgrid(1:n); 
for i = 2:q 
    % calculate k 
    U = u(k + index); 
    % rest of code goes here 
end 

哪些,雖然它的工作,可悲非常緩慢,不適合我的需要。有沒有更有效的方法來達到這個結果?

+0

看起來像你只需要一個Toeplitz矩陣,http://www.mathworks。com/help/matlab/ref/toeplitz.html – bla

回答

4

該操作有很多重複。因此,利用這一點非常自然,這是一個使用repmat一個方法,並從bsxfun's一點幫助掩蔽能力 -

mask = bsxfun(@ge,(1:2*n+1)',n+1:-1:1) & bsxfun(@ge,(2*n+1:-1:1)',1:n+1) 
sliced_u = u(k+n:-1:k-n) 
repvals = repmat(sliced_u(:),1,n+1) 
out = reshape(repvals(mask),n+1,[]) 

一個可以描述這種方法是看所需要的輸出的列作爲一個地方移結合的方式當輸入u的柱狀版本沿列複製時,我們遍歷右邊。其餘的工作是抵消沿着柱子移動的一個地方,這是通過bsxfun的遮蔽來完成的,以切斷上部和下部三角形區域以給我們最終的輸出。

表現:這個想法在this solution的類似問題之前已被利用,我期望在這裏有類似的性能數字。


作爲另一種方法和思維直接的,一個可以只使用bsxfun獲得2D索引,然後索引u的最終輸出,像這樣 -

out = u(bsxfun(@plus,(k:-1:k-n)',0:n)) 
+0

雖然我沒有想到,但你的第二個直接的方法更好。然而,甚至更好的方法是在'for循環'之外創建一個常量索引矩陣,爲每個循環所需的值抽取向量'u',然後通過對採樣向量進行索引來構造矩陣。既然你的文章是幫助我實現這個結果的,我接受了這個答案。謝謝。 – nikaltipar

+0

@naltipar很高興聽到這有幫助!祝你好運。 – Divakar

4

這應該工作:

k = 20;  % Example k 
n = 5;  % Example n < k 

u = 1:50; % Example vector 

[x, y] = meshgrid(0:n,k:-1:k-n); 
U = u(x+y) % Use x+y as index 
U = 

    20 21 22 23 24 25 
    19 20 21 22 23 24 
    18 19 20 21 22 23 
    17 18 19 20 21 22 
    16 17 18 19 20 21 
    15 16 17 18 19 20 

正如你所看到的,左上角爲單元號k,右上方是單元號k+n,左下角是k-n和右下方是元素k

+0

感謝您的回答。這個實現與我的完全相同,儘管你的寫作更優雅,並且可悲地不會促進循環。 – nikaltipar

6

您可以使用內置的一個班輪在toeplitz

toeplitz(20:-1:15,20:25) 

ans = 

20 21 22 23 24 25 
19 20 21 22 23 24 
18 19 20 21 22 23 
17 18 19 20 21 22 
16 17 18 19 20 21 
15 16 17 18 19 20 

或者,在一個更通用的方法:

f = @(k,n)toeplitz(k:-1:k-n,k:k+n) 

,然後你可以只寫U=u(f(k,n))獲得的通用形式題。 但檢查是否確實比你的for循環更快。

編輯:toeplitz的內部機械是bsxfun,所以我猜想,除非你在較低級別的c \ fortran中意識到這一點,這是一樣好。檢查edit toeplitz並查看它是如何實現的...

+0

感謝您的回答。爲了僅保留每個循環的所需值,採樣後,使用toeplitz肯定會使循環運行得更快。 – nikaltipar