MATLAB Answers

How to create a large matrix using another matrix

1 view (last 30 days)
Hello everyone, I want to make a large matrix (10^7 x 10^7) but it needs to have the following matrix being repeated around its main diagonal.
a=4;
A=[1 0 a+1 0;
a+2 2 0 a+1;
0 a+2 3 0;
0 0 a+2 4];
As you can see it is a main diagonal with 1:10^7 and 1 row lower repeating the number 6 and 2 rows higher repeating the number 5.
Everything I have tried turns out to be huge in terms of memory and unable to be performed like that. I suppose the trick is by somehow making use of a sparse matrix, but I cannot get it to work properly.
Thanks a lot in advance!

  8 Comments

Show 5 older comments
Petros Tsitouras
Petros Tsitouras on 1 Jun 2020
Found out the difference, I have calculated the Acom as follows:
Adiag=(1:N);
A1=ones(1,N)*(a+2);
A2=ones(1,N)*(a+1);
Acom=[A1; zeros(1,N); Adiag; A2];
B=spdiags(Acom',-1:2,N,N);
Which results to
Acom:
instead of:
and B:
instead of:
Not sure which approach is the mathematically correct one.
Walter Roberson
Walter Roberson on 1 Jun 2020
Your original request shows the a+2 below the diagonal, so anything that ends up with the 6 above the diagonal is a wrong approach ;-)
The approach I used of constructing columns instead of rows has the advantage of not needing to transpose Acom, and so is more efficient.
Petros Tsitouras
Petros Tsitouras on 1 Jun 2020
Then I will have to aggree with you and tell you a huge thanks once more!! Have a good day!

Sign in to comment.

Accepted Answer

Walter Roberson
Walter Roberson on 30 May 2020
Edited: Walter Roberson on 1 Jun 2020

  4 Comments

Show 1 older comment
Petros Tsitouras
Petros Tsitouras on 30 May 2020
Got it! Thanks a alot for the help! Is there anyway to upscale this to a 10^7 x 10^7 matrix?
Walter Roberson
Walter Roberson on 30 May 2020
a=4;
N=1E7;
Adiag=(1:N).';
A1=ones(N,1)*(a+2);
A2=ones(N,1)*(a+1);
Acom=[A2, Adiag, zeros(N,1), A1];
B=spdiags(Acom,-1:2,N,N);

Sign in to comment.

More Answers (0)

Products


Release

R2019b

Translated by