Help reducing memory usage during large matrix multiplication

조회 수: 7 (최근 30일)
Hayao
Hayao 2018년 5월 29일
댓글: Sergey Kasyanov 2018년 6월 9일
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
KSSV
KSSV 2018년 5월 29일
Why don't you, substitute value of t, convert it to double and then multiply?
Hayao
Hayao 2018년 5월 29일
편집: Hayao 2018년 5월 29일
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.

댓글을 달려면 로그인하십시오.

답변 (1개)

Sergey Kasyanov
Sergey Kasyanov 2018년 6월 9일
편집: Sergey Kasyanov 2018년 6월 9일
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
Sergey Kasyanov
Sergey Kasyanov 2018년 6월 9일
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

댓글을 달려면 로그인하십시오.

Community Treasure Hunt

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

Start Hunting!

Translated by