Help reducing memory usage during large matrix multiplication

4 Ansichten (letzte 30 Tage)
Hayao
Hayao am 29 Mai 2018
Kommentiert: Sergey Kasyanov am 9 Jun. 2018
I have a certain 343-by-343 matrix V3 and a certain 343-by-1 vector V2 produced by certain algorithm and I want to do the following operation:
V4 = V3*(V2-I*C)
where I = eye(343), and C is a vector of zeros except for the 172th element, which is 1. I provided V3 and V2 as a workspace file in attachment. The size for V2 is actually big despite only having 343 elements because the elements contain symbols (namely "t") and a lot numbers. But the lengthy values of these elements are crucial.
The problem is, the memory usage during the calculation is about 14.5 GB (out of 15.284 GB available), and the calculation is quite slow. Since I am planning to do much larger scale calculations, this is very problematic to me.
Is there any workaround to prevent using so much RAM? Or is there nothing I can do other than to expand the RAM?
  2 Kommentare
KSSV
KSSV am 29 Mai 2018
Why don't you, substitute value of t, convert it to double and then multiply?
Hayao
Hayao am 29 Mai 2018
Bearbeitet: Hayao am 29 Mai 2018
Thank you KSSV.
Well, the problem is that I am planning t = inf or t = 0:0.000002:0.005.
For the former, I know it is going to converge once I put t = inf after the calculation is ultimately finished, but I don't know if it will diverge or converge if I put t = inf before the calculation is finished.
For the latter, you are right. I could just put the values and use array calculation or for-loop. The problem is that I won't know the equation itself in case I need to rescale the value of t to something else.

Melden Sie sich an, um zu kommentieren.

Antworten (1)

Sergey Kasyanov
Sergey Kasyanov am 9 Jun. 2018
Bearbeitet: Sergey Kasyanov am 9 Jun. 2018
I think that problem can be solved by the manual multiplication of matrices.
%note: V2=(V2-I*C) is the same V2(172)=V2(172)-1;
V2(172)=V2(172)-1;
A=vpa(zeros(length(V2),1));
V2=V2.';
for i=1:length(V2)
A(i)=sum(V3(i,:).*V2);
end
A is the answer.
  1 Kommentar
Sergey Kasyanov
Sergey Kasyanov am 9 Jun. 2018
Also you may use that solution. It claims less memory but It has less accuracy due to convertion integer ratio coefficients to float .
V2(172)=V2(172)-1;
A=vpa(zeros(length(V2),1));
V2=vpa(V2.');
for i=1:length(V2)
A(i)=sum(V3(i,:).*V2);
end

Melden Sie sich an, um zu kommentieren.

Community Treasure Hunt

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

Start Hunting!

Translated by