我正在努力完成这项任务:
创建一个递归函数,它将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
有人可以帮忙吗?
答案 0 :(得分: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 :(得分: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
优点:不使用循环,对于大N我肯定会更快。我强烈建议逐行运行以查看输出是什么,因此您可以逐步了解它是如何构建的。