2016-03-01 139 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