2016-03-01 134 views
3

我與這個任務掙扎:Matlab的遞​​歸函數生成矩陣

創建一個遞歸函數採用N作爲一個參數,並創建這樣一個矩陣,在這種情況下,n = 3:

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

我已經想出了這一點:

function AA = A(n) 
    if n == 0 
     AA (1,1) = 0; 
    else 
     AA = n*ones(n+1,2*n+1); 
     AA(1:n, [1:n, n+3:end]) = A(n-1); 
    end 
end 

但產量似乎對RHS一個奇怪的變化:

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

有人可以幫忙嗎?

+3

它應該是什麼樣子的'N = 2'或'N = 4'?我大部分都被「3」的中間列混淆了。 – Dan

+1

這是一個任務/你必須使用遞歸? – Daniel

+0

更有意義,儘管最有意義的是中間兩列三分之一...... – Dan

回答

7

我認爲這兩個答案已經存在可以簡化。對於遞歸溶液使用:

function AA = A(n) 
    if n == 0 
     AA = 0; 
    else 
     h=A(n-1); 
     AA = n*ones(n+1,2*n+1); 
     AA(1:n,1:n)=h(:,1:n); 
     AA(1:n,n+2:end)=h(:,n:end); 
    end 
end 

重要的一點是要索引的中間結果的列n兩次重複它,一個在h(:,1:n),一次在h(:,n:end)

如果你正在尋找一個矢量/更快的解決方案只需使用:

bsxfun(@max,[0:N-1].',[0:N-1 N-2:-1:0]) 
+1

完美,來自亞琛的問候;) – MEVIS3000

4

我有一個無環路的答案是有點非正統的,但它工作得很好,是非常有趣的寫(或說我對目前工作的厭煩)..

N =3; 
A = repmat(0:N,N+1,1); 
M = triu(A,1); 
B = repmat((0:N)',1,N+1); 
L = fliplr(flipud(triu(flipud(B)))); 
P = M+L; 
Rep = fliplr(P(:,1:N)); 
answer = [P,Rep]; 

這一個使用triu生成矩陣中的漸進模式,並做了一些有趣的建設,創建最終的矩陣:

N = 2; 

answer = 

0  1  2  1  0 
1  1  2  1  1 
2  2  2  2  2 

N = 4; 

answer = 

0  1  2  3  4  3  2  1  0 
1  1  2  3  4  3  2  1  1 
2  2  2  3  4  3  2  2  2 
3  3  3  3  4  3  3  3  3 
4  4  4  4  4  4  4  4  4 

優點:不使用循環,肯定會快於大NI assume.I高度建議運行線通過一行來看看輸出是什麼,所以你理解nd如何逐步構建它。

+0

真的有趣,但'沒有循環!=更快' – percusse

+2

@percusse當然:D,但我認爲像flip和sum這樣的矩陣操作應該是非常快速的操作。 – GameOfThrows