Azzera filtri
Azzera filtri

Kronecker Tensor Product for very large matrices

6 visualizzazioni (ultimi 30 giorni)
I need to build a 2D kronecker tensor product of with a size of approximately 10^6 x 10^6. The problem is that I get the following message:
%Out of memory. Type HELP MEMORY for your options.
Is there any way to get around this memory limitation? My code is posted below:
nx = 1000;ny = 1000; %Number of points along x and y
dx = 1/(nx-1);dy = 1/(ny-1); %Spacing between each point
diag_block = eye(ny-1) * (-2/dx^2-2/dy^2); %Identity Matrix of ny-1 points
diag_block = diag_block + diag(ones(ny-2,1)/dy^2,1); %
diag_block = sparse(diag_block) + sparse(diag(ones(ny-2,1)/dy^2,-1)); %
Matrix = kron(sparse(eye(nx-1)),sparse(diag_block)); %Using sparse() made this line work
Matrix = Matrix + diag(ones((nx-2) * (ny-1),1)/dx^2, ny-1); %FAILS HERE!!!
Matrix = Matrix + diag(ones((nx-2) * (ny-1),1)/dx^2, -(ny-1)); %AND HERE!!!

Risposta accettata

Matt J
Matt J il 16 Lug 2021
Modificato: Matt J il 16 Lug 2021
You need the matrices generated by diag() in sparse form, too. Use spdiags() instead, e.g.,
nx = 3;ny =3; dx=1; %Number of points along x and y
Qfull=diag(ones((nx-2) * (ny-1),1)/dx^2, ny-1)
Qfull = 4×4
0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0
Bin=[0;0;ones((nx-2) * (ny-1),1)/dx^2];
Q=spdiags(Bin,ny-1,4,4)
Q =
(1,3) 1 (2,4) 1
full(Q)
ans = 4×4
0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0
  4 Commenti
William Kett
William Kett il 18 Lug 2021
Ah! So when I create A and B using spdiags(), I am instead getting a scalar instead of getting a matrix and by adding a scalar to the Matrix, I guess it fills in the empty space and creates a non-sparse matrix? I did not change my arguments or the order in which I passed them in from when I changed from diag() to spdiags().
Could this be why?
Changing nx = ny = 4 yields the following Matrix:
Matrix =
-36 9 0 9 0 0 0 0 0
9 -36 9 0 9 0 0 0 0
0 9 -36 0 0 9 0 0 0
9 0 0 -36 9 0 9 0 0
0 9 0 9 -36 9 0 9 0
0 0 9 0 9 -36 0 0 9
0 0 0 9 0 0 -36 9 0
0 0 0 0 9 0 9 -36 9
0 0 0 0 0 9 0 9 -36
and converting that to sparse by running sparse(Matrix) yields:
ans =
(1,1) -36
(2,1) 9
(4,1) 9
(1,2) 9
(2,2) -36
(3,2) 9
(5,2) 9
(2,3) 9
(3,3) -36
(6,3) 9
(1,4) 9
(4,4) -36
(5,4) 9
(7,4) 9
(2,5) 9
(4,5) 9
(5,5) -36
(6,5) 9
(8,5) 9
(3,6) 9
(5,6) 9
(6,6) -36
(9,6) 9
(4,7) 9
(7,7) -36
(8,7) 9
(5,8) 9
(7,8) 9
(8,8) -36
(9,8) 9
(6,9) 9
(8,9) 9
(9,9) -36
So, I know that I am supposed to be getting a non-scalar result for my A and B, so it's hopefully the case that I just input my arguments incorrectly.
Matt J
Matt J il 18 Lug 2021
Modificato: Matt J il 18 Lug 2021
Could this be why?
Yes, you should review the documentation for spdiags() and/or re-examine the example I gave. you It's syntax is very different from that of diag().

Accedi per commentare.

Più risposte (0)

Categorie

Scopri di più su Sparse Matrices in Help Center e File Exchange

Prodotti


Release

R2020a

Community Treasure Hunt

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

Start Hunting!

Translated by