如何构建递减的下三角矩阵?

时间:2015-10-17 10:38:43

标签: arrays matlab matrix vectorization

您知道是否可以获得以下三角矩阵

[N:-1:1; (N-1): - 1:0; (N-2): - 1:0 0; (N-3): - 1:0 0 0; ....]没有用horzcat编写每一行而不使用循环? 谢谢大家 弗雷德

3 个答案:

答案 0 :(得分:3)

也许是这样的:

N=10;
M=triu(gallery('circul',N)).'

M =

    1    0    0    0    0    0    0    0    0    0
    2    1    0    0    0    0    0    0    0    0
    3    2    1    0    0    0    0    0    0    0
    4    3    2    1    0    0    0    0    0    0
    5    4    3    2    1    0    0    0    0    0
    6    5    4    3    2    1    0    0    0    0
    7    6    5    4    3    2    1    0    0    0
    8    7    6    5    4    3    2    1    0    0
    9    8    7    6    5    4    3    2    1    0
   10    9    8    7    6    5    4    3    2    1

或者你想要这个:

M=fliplr(triu(gallery('circul',N)))
M =

   10    9    8    7    6    5    4    3    2    1
    9    8    7    6    5    4    3    2    1    0
    8    7    6    5    4    3    2    1    0    0
    7    6    5    4    3    2    1    0    0    0
    6    5    4    3    2    1    0    0    0    0
    5    4    3    2    1    0    0    0    0    0
    4    3    2    1    0    0    0    0    0    0
    3    2    1    0    0    0    0    0    0    0
    2    1    0    0    0    0    0    0    0    0
    1    0    0    0    0    0    0    0    0    0

我无法从你的代码示例中确切地告诉你要去哪个方向。

答案 1 :(得分:3)

这是你想要的吗?

N = 8;
result = flipud(tril(toeplitz(1:N)));

这给出了

result =    
     8     7     6     5     4     3     2     1
     7     6     5     4     3     2     1     0
     6     5     4     3     2     1     0     0
     5     4     3     2     1     0     0     0
     4     3     2     1     0     0     0     0
     3     2     1     0     0     0     0     0
     2     1     0     0     0     0     0     0
     1     0     0     0     0     0     0     0

答案 2 :(得分:1)

bsxfun 强大的力量你!

[[N:-1:1]' reshape(repmat([N-1:-1:1]',1,N).*bsxfun(@ge,[1:N-1]',1:N),N,[])]

示例运行 -

>> N = 8;
>> [[N:-1:1]' reshape(repmat([N-1:-1:1]',1,N).*bsxfun(@ge,[1:N-1]',1:N),N,[])]
ans =
     8     7     6     5     4     3     2     1
     7     6     5     4     3     2     1     0
     6     5     4     3     2     1     0     0
     5     4     3     2     1     0     0     0
     4     3     2     1     0     0     0     0
     3     2     1     0     0     0     0     0
     2     1     0     0     0     0     0     0
     1     0     0     0     0     0     0     0

这基本上是由this another bsxfun-based solution启发的一个非常相似的问题 - Replicate vector and shift each copy by 1 row down without for-loop。在那里你可以看到类似的解决方案和相关的基准,因为在这里看起来性能是一个问题。