2013-03-22 90 views
1

假設我們有以下1D陣列創建具有從一維向量行長度L矩陣

x(1),x(2),......x(n) 

其中n是樣品的長度,假設我們想創建矩陣使用以下規則從該元件包括,使用一些參數L,我們的二維陣​​列包括由以下元素

以下代碼

function [ x ]=create_matrix(b,n,L) 
for i=1:n/2 
    x(i,end)=b(i:L); 
end; 
(1 row) x(1),x(2),.....x(l) 
(2 row) x(2),x(3),.....x(l+1) 
(3 row) x(3),x(4),.......x(l+2) 
. 
. 
. 
.(m row) x(m),x(m+1).... x(n) 

我試圖

其中b是輸入1D向量,n是長度(b)中,L爲矩陣的行長度,但是當運行此代碼,我得到以下錯誤

??? Undefined function or variable "x". 

Error in ==> create_matrix at 4 
    x(i,end)=b(i:L); 

也許東西在MATLAB二維陣列的錯誤聲明?,還是其他什麼東西其實我知道這是很容易實現,但我不能我自己,請大家幫忙

回答

2

代碼:

function [ x ]=create_matrix(b,l) 
    n = length(b); 
    m = n-l+1; 
    x = zeros(m,l); 
    for i=1:m 
     x(i,:)=b(i:i+l-1); 
    end; 
end 

例子:

EDU>> create_matrix(1:10,4) 

ans = 

    1  2  3  4 
    2  3  4  5 
    3  4  5  6 
    4  5  6  7 
    5  6  7  8 
    6  7  8  9 
    7  8  9 10 

另外,這個矩陣是一個翻轉的toeplitz矩陣。於是同樣的事情可以實現:

fliplr(toeplitz(4:10,4:-1:1)) 

輸出:

ans = 

    1  2  3  4 
    2  3  4  5 
    3  4  5  6 
    4  5  6  7 
    5  6  7  8 
    6  7  8  9 
    7  8  9 10 
+0

所以米應該有不同的價值嗎? – 2013-03-22 17:31:31

+0

aa是的,因爲儘可能多我們改變l,m會被改變是的,我也看到 – 2013-03-22 17:33:13

+1

@dato,更有效的實現可能是將列分配給x而不是像上面那樣。這是因爲MATLAB是專欄。 – Justin 2013-03-22 17:37:16

2

另一種選擇(在性能上可能更快)是使用bsxfun,例如

m=7; 
l=4; 
bsxfun(@plus,[1:m]',0:l-1) 

ans = 
1  2  3  4 
2  3  4  5 
3  4  5  6 
4  5  6  7 
5  6  7  8 
6  7  8  9 
7  8  9 10 

或爲通用載體x使用

x(bsxfun(@plus,x(1:m)',0:x(l-1))) 
+0

如果'x'是一個隨機向量我不是確定這種方法將起作用。 – Justin 2013-03-23 02:48:10

+2

我認爲它會,因爲'bsxfun'解決方案是爲'x'的索引,所以對於'x'只需要'x(bsxfun(@ ...)) – bla 2013-03-23 03:45:43

+0

哇,這很聰明。 – Justin 2013-03-23 04:06:12

相關問題