Generate a large almost diagonal matrix
17 visualizaciones (últimos 30 días)
Mostrar comentarios más antiguos
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 comentarios
Respuestas (3)
John D'Errico
el 29 de Oct. de 2022
Editada: John D'Errico
el 29 de Oct. de 2022
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 comentarios
Ver también
Categorías
Más información sobre Octave en Help Center y File Exchange.
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!