Symmetric Matrix-Vector Multiplication with only lower triangular stored
    18 visualizaciones (últimos 30 días)
  
       Mostrar comentarios más antiguos
    
    Jan Marxen
 el 24 de Abr. de 2021
  
    
    
    
    
    Comentada: Jan Marxen
 el 27 de Abr. de 2021
            I have a very big (n>1000000) sparse symmetric positive definite matrix A and I want to multiply it efficiently by a vector x. Only the lower triangular of matrix A is stored with function "sparse". Is there any function inbuilt or external that anyone knows of that takes as input only the lower triangular and performs the complete operation Ax without having to recover whole A (adding the strict upper triangular again)? 
Thank you very much,
Jan
0 comentarios
Respuesta aceptada
  Jan
      
      
 el 24 de Abr. de 2021
        
      Editada: Jan
      
      
 el 24 de Abr. de 2021
  
      Plese check if this is efficient in your case:
A = rand(5, 5);
A = A + A';      % Symmetric example matrix
B = tril(A);     % Left triangular part
x = rand(5, 1);
y1 = A * x;
y2 = B * x + B.' * x - diag(B) .* x;
y1 - y2
I assume that Matlab's JIT can handle B.' * x without computing B.' explicitly. Alternative:
y2 = B * x + B.' * x - diag(diag(B)) * x;
6 comentarios
  Clayton Gotberg
      
 el 25 de Abr. de 2021
				You may try taking advantage of the reshape command as @Bruno Luong suggested below, to see if it's any faster than the transpose for row and column vectors.
When you say that the difference between A*x and B*x+B'x-diag(B).*x gets larger, do you mean that the time cost is larger or that the numbers actually change? Mathematically, that shouldn't be happening, but computers+numbers == funny things.
If the time cost just becomes too high, I can take another pass at it with an eye to exploiting the symmetry of the problem. My gut reaction was this handy identity, but there have to be a few dozen more ways to skin this cat.
Más respuestas (1)
  Clayton Gotberg
      
 el 24 de Abr. de 2021
        If 
 is a symmetric matrix and 
 is the lower triangular part of the matrix and 
 is the upper triangular part of the matrix:
 is the lower triangular part of the matrix and 
 is the upper triangular part of the matrix:
 where the diagonal function only finds the diagonal elements of 
. This is because of a few relations:


To save time and space on MATLAB (because the upper triangular matrix will take up much more space), take advantage of the relations:

To get:
Now, the MATLAB calculation is 
A_times_x = A_LT*x+(x.'*A_LT).'+ diag(A_LT).*x;
This should only perform transposes on the smaller resultant matrices.
7 comentarios
  Bruno Luong
      
      
 el 24 de Abr. de 2021
				
      Editada: Bruno Luong
      
      
 el 24 de Abr. de 2021
  
			Might be you can experiment with this as well
reshape((x.'*A),[],1)
  Clayton Gotberg
      
 el 24 de Abr. de 2021
				I begin to understand why engineers are specifically trained and hired to test software. It's deeply interesting to get this peek into what MATLAB does to ensure I can keep writing ill-considered code.
Ver también
Categorías
				Más información sobre Loops and Conditional Statements 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!