首页 文章

Matlab递归函数生成矩阵

提问于
浏览
3

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

创建一个递归函数,它将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

有人可以帮忙吗?

2 回答

  • 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])
    
  • 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我肯定会更快 . 我强烈建议逐行运行以查看输出是什么,因此您逐步了解它是如何构建的 .

相关问题