2014-02-06 81 views
5

我想構造接受輸入的n個的函數,並給出了矢量Matlab的創建矢量序列

[n n-1 n-2 ... n-n, n-1 n-2 ... n-n, ..., n-n] 

//Example 
input : n=3 
output : [3 2 1 0 2 1 0 1 0 0] 

我知道如何使用循環做到這一點,但是我正在尋找一個聰明的辦法做到這一點的MATLAB

+0

我不明白序列如何去fr在n-n ... n-n到底 – Wajahat

+0

@Wajahat我已經加了一些逗號,希望澄清一下。 –

回答

7

您可以使用repmat重複幾次矩陣,然後通過tril只選擇三角形部分。就像這樣:

n=3; 
x=repmat(n:-1:0,1,n+1); 
result=x(tril(ones(n+1))>0) 

或者在同一行:

n=3; 
getfield(repmat(n:-1:0,1,n+1),{reshape(tril(ones(n+1))>0,1,(n+1)^2)}) 

此函數的結果是所需的輸出:

result = 

    3  2  1  0  2  1  0  1  0  0 
+0

謝謝。我認爲repmat是關鍵功能。現在瞭解更多... – jim

+0

我認爲你需要'(n + 1)^ 2'來代替16 – jim

+0

是的,我粘貼了我的稿子太快了:) – mmumboss

4

既然你沒有得到任何答案,這裏有一個方式做到這一點:

N = 3; 
x = repmat(N:-1:0,1,N+1)-cumsum(repmat([1 zeros(1,N)],1,N+1))+1 
x = x(x>=0) 
x = 
    3 2 1 0 2 1 0 1 0 0 
+2

或者其他:'x = mod((N + 1)^ 2-1:-1:0,4) - ceil((1:((N + 1)^ 2))/(N + 1))+ 1'在一個非常相似的脈絡 – Dan

+1

也許是一個品味的問題,但我會去中間這樣的事情: 'repmat(N:-1:0,N + 1,1)' - repmat(1:N + 1,N + 1,1)+ 1' –