Matlab递归函数生成一个矩阵
我正在努力完成这项任务: 创建一个以n为参数的递归函数,并创建如下矩阵,在本例中,n=3: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
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])