Matlab递归函数生成一个矩阵

Matlab递归函数生成一个矩阵,matlab,recursion,matrix,Matlab,Recursion,Matrix,我正在努力完成这项任务: 创建一个以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

我正在努力完成这项任务:

创建一个以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

有人能帮忙吗?

我有一个没有循环的答案,这有点离经叛道,但它工作很好,写起来很有趣(或者说我现在工作很无聊)

这一个使用
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

优点:不使用循环,我想对于大N肯定会更快。我强烈建议逐行运行,看看输出是什么,这样您就可以一步一步地理解它是如何构造的。

我认为已经存在的两个答案都可以简化。对于递归解决方案,请使用:

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])
对于MATLAB 2016b或更高版本,可以使用:

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

对于
n=2
n=4
,它应该是什么样子?我大部分都被中间代码“<代码> 3”/>代码>迷惑了。这是一个赋值吗?你必须使用递归吗?更有意义,虽然最有意义的是两个中间的三列……只是第一个注释,你的基本情况是正确的吗?
n==0
的输出应该是什么?它应该是
[0]
还是
[0,0]
?我认为你的问题不在于你有一个转变,而是你错过了你的最后一个专栏。确实很有趣,但是
没有循环!=更快
@percusse当然:D但我认为像翻转和求和这样的矩阵运算应该是非常快速的运算
max([0:N-1].',[0:N-1 N-2:-1:0])