Generate a large almost diagonal matrix
13 次查看(过去 30 天)
显示 更早的评论
I want to generate a 1000x1000 matrix where the diagonals are 1 and the extries above the diagonal are -1. How do I do that? Thanks!
0 个评论
回答(3 个)
John D'Errico
2022-10-29
编辑:John D'Errico
2022-10-29
This is commonly known as a bidiagonal matrix.
It is far and away best defined using sparse storage, as produced by spdiags, since your matrix has only 2 non-zero elements on every row.
But there would be many ways to create such a matrix. You could build it as a Toeplitz matrix. Of course, that would be full, not sparse.
n = 8; % produce an 8x8 matrix, so small enough to display here
A1 = toeplitz([1;zeros(n-1,1)],[1 -1,zeros(1,n-2)]);
A1
Or you could be glitzy, and not worry about the memory or even worry about efficiency.
A2 = ones(n);
A2 = triu(A2) - 2*triu(A2,1) + triu(A2,2);
A2
Or you could use indexing, with sub2ind.
A3 = zeros(n);
A3(sub2ind([n,n],1:n,1:n)) = 1;
A3(sub2ind([n,n],1:n-1,2:n)) = -1;
A3
Best, as I said, is to use spdiags, since this really is a bi-diagonal matrix. Create it using a tool designed to produce banded matrices. Matt showed you how.
0 个评论
另请参阅
类别
在 Help Center 和 File Exchange 中查找有关 Octave 的更多信息
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!