您知道是否可以获得以下三角矩阵
[N:-1:1; (N-1): - 1:0; (N-2): - 1:0 0; (N-3): - 1:0 0 0; ....]没有用horzcat编写每一行而不使用循环? 谢谢大家 弗雷德
答案 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。在那里你可以看到类似的解决方案和相关的基准,因为在这里看起来性能是一个问题。