Tridiagonal Matrix with subdiagonal and main diagonal is also matrix

10 vues (au cours des 30 derniers jours)
Mücahit Özalp
Mücahit Özalp le 12 Mai 2021
Commenté : Matt J le 14 Mai 2021
I have two matrices A and B. I want A to be main diagonal and B to be my subdiagonals. How do I create such a matrix? By the way sizes of A and B changes but they are square matrices.
Specifically, a1=4,b1=-1
A =diag(a1*ones(1,N-1)) + diag(b1*ones(1,N-2),1) + diag(b1*ones(1,N-2),-1)
B=(-1)*eye(N-1)
These are my A and B matrices. I need to define a (N-1)*(N-1) times (N-1)*(N-1) matrix . For example for N=1000 or N=5000 I should be able to change the N value.
  14 commentaires
Mücahit Özalp
Mücahit Özalp le 14 Mai 2021
Modifié(e) : Mücahit Özalp le 14 Mai 2021
@Matt JIt's me again now I can form the matrix for N=5000 but I need to evaluate its smallest 10 eigenvalues using E=eigs(D,10,'smallestabs'); I get out of memory error. Is there a way to solve that.
Matt J
Matt J le 14 Mai 2021
I don't think so, but if you post a new question on it (ideally with a demo), others on the forum may have some thoughts.

Connectez-vous pour commenter.

Réponse acceptée

Matt J
Matt J le 12 Mai 2021
Modifié(e) : Matt J le 12 Mai 2021
So, you want a block Toeplitz matrix?
N = 5;
A =diag([7 4 4]);
B=[8 8 10; 2 5 2; 10 8 7];
C=zeros(3);
blocks={C,B,A};
result=cell2mat(blocks( toeplitz(1+[2,1,zeros(1,N-2)]) ))
result = 15×15
7 0 0 8 8 10 0 0 0 0 0 0 0 0 0 0 4 0 2 5 2 0 0 0 0 0 0 0 0 0 0 0 4 10 8 7 0 0 0 0 0 0 0 0 0 8 8 10 7 0 0 8 8 10 0 0 0 0 0 0 2 5 2 0 4 0 2 5 2 0 0 0 0 0 0 10 8 7 0 0 4 10 8 7 0 0 0 0 0 0 0 0 0 8 8 10 7 0 0 8 8 10 0 0 0 0 0 0 2 5 2 0 4 0 2 5 2 0 0 0 0 0 0 10 8 7 0 0 4 10 8 7 0 0 0 0 0 0 0 0 0 8 8 10 7 0 0 8 8 10
  8 commentaires
Matt J
Matt J le 12 Mai 2021
N = 1000;
a1=4;b1=-1;
A =diag(a1*ones(1,N-1)) + diag(b1*ones(1,N-2),1) + diag(b1*ones(1,N-2),-1);
B=(-1)*speye(N-1) ;
C=sparse(N-1,N-1);
blocks={C,B,sparse(A)};
result=cell2mat(blocks( toeplitz(1+[2,1,zeros(1,N-3)]) ));
whos result
Name Size Bytes Class Attributes result 998001x998001 103680256 double sparse
Mücahit Özalp
Mücahit Özalp le 12 Mai 2021
@Matt J This works now. Awesome.

Connectez-vous pour commenter.

Plus de réponses (1)

Matt J
Matt J le 12 Mai 2021
Here's another way, probably much faster.
N=1000;
a1=4;b1=-1;
A =diag(a1*ones(1,N-1)) + diag(b1*ones(1,N-2),1) + diag(b1*ones(1,N-2),-1);
B=(-1)*eye(N-1);
E0=speye(N);
E1=E0(2:end,1:end-1);
E0=E0(1:end-1,1:end-1);
result=kron(E0,A) + kron(E1,B)+kron(E1.',B);
whos result
Name Size Bytes Class Attributes result 998001x998001 87760160 double sparse

Catégories

En savoir plus sur Performance and Memory dans Help Center et File Exchange

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by