Matlab Program running very slow
显示 更早的评论
Hi All,
I have a function that assigns a matrix 400*400 element value based on another 400*400 matrix element value. It can not be simply done by matrix_A=matrix_B. I do it elementwise.
The program runs super slow. I used a double loop to call the function. Anybody has suggestion/advice on the issue? I posted my codes as below just for reference. Thanks a million in advance.
iInd=zeros((nqubits-1)*nqubits,1);
jInd=zeros((nqubits-1)*nqubits,1);
val=zeros((nqubits-1)*nqubits,1)
elementNum=1;
%add coupling
for i=1:1:(num-1)
for j=i:1:num
if interaction(i,j) ~=0
%J=zeros(nqubits,nqubits)
H=zeros(1,nqubits)
varindex1=getvarindex(i,var_size);
varindex2=getvarindex(j,var_size);
if varindex1==1
startnum1=0
varstartnum1=0
else
startnum1=0
varstartnum1=0
for k=1:1:(varindex1-1)
startnum1=startnum1+var_size(k)-1
varstartnum1=varstartnum1+var_size(k)
end
end
if varindex2==1
startnum2=0
varstartnum2=0
else
startnum2=0
varstartnum2=0
for k=1:1:(varindex2-1)
startnum2=startnum2+var_size(k)-1
varstartnum2=varstartnum2+var_size(k)
end
end
if (i-varstartnum1) ==1
if (j-varstartnum2)==1
%J(startnum1+1,startnum2+1)=1
iInd(elementNum)=startnum1+1;
jInd(elementNum)=startnum2+1;
val(elementNum)=1;
elementNum=elementNum+1;
H(startnum1+1)=1
H(startnum2+1)=1
elseif (j-varstartnum2)==var_size(varindex2)
m=var_size(varindex2)
%J(startnum1+1,startnum2+m-1)=-1
iInd(elementNum)=startnum1+1;
jInd(elementNum)=startnum2+m-1;
val(elementNum)=-1;
elementNum=elementNum+1;
H(startnum1+1)=1
H(startnum2+m-1)=-1
else
% k1=i-varstartnum1
k2=j-varstartnum2
%J(startnum1+1,startnum2+k2)=1
iInd(elementNum)=startnum1+1;
iInd(elementNum+1)=startnum1+1;
jInd(elementNum)=startnum2+k2;
jInd(elementNum+1)=startnum2+k2-1;
val(elementNum)=1;
val(elementNum+1)=-1;
elementNum=elementNum+2;
%J(startnum1+1,startnum2+k2-1)=-1
H(startnum2+k2)=1
H(startnum2+k2-1)=-1
end
elseif (i-varstartnum1)==var_size(varindex1)
m1=var_size(varindex1)
if (j-varstartnum2)==1
%J(startnum1+m1-1,startnum2+1)=-1
iInd(elementNum)=startnum1+m1-1;
jInd(elementNum)=startnum2+1;
val(elementNum)=-1;
elementNum=elementNum+1;
H(startnum1+m1-1)=-1
H(startnum2+1)=1
elseif (j-varstartnum2)==var_size(varindex2)
m2=var_size(varindex2)
%J(startnum1+m1-1,startnum2+m2-1)=1
iInd(elementNum)=startnum1+m1-1;
jInd(elementNum)=startnum2+m2-1;
val(elementNum)=1;
elementNum=elementNum+1;
H(startnum1+m1-1)=-1
H(startnum2+m2-1)=-1
else
k2=j-varstartnum2
%J(startnum1+m1-1,startnum2+k2)=-1
%J(startnum1+m1-1,startnum2+k2-1)=1
iInd(elementNum)=startnum1+m1-1;
iInd(elementNum+1)=startnum1+m1-1;
jInd(elementNum)=startnum2+k2;
jInd(elementNum+1)=startnum2+k2-1;
val(elementNum)=-1;
val(elementNum+1)=1;
elementNum=elementNum+2;
H(startnum2+k2)=1
H(startnum2+k2-1)=-1
end
else
k1=i-varstartnum1
if (j-varstartnum2)==1
%J(startnum1+k1,startnum2+1)=1
%J(startnum1+k1-1,startnum2+1)=-1
iInd(elementNum)=startnum1+k1;
iInd(elementNum+1)=startnum1+k1-1;
jInd(elementNum)=startnum2+1;
jInd(elementNum+1)=startnum2+1;
val(elementNum)=1;
val(elementNum+1)=-1;
elementNum=elementNum+2;
H(startnum1+k1)=1
H(startnum1+k1-1)=-1
elseif (j-varstartnum2)==var_size(varindex2)
m2=var_size(varindex2)
%J(startnum1+k1,startnum2+m2-1)=-1
%J(startnum1+k1-1,startnum2+m2-1)=1
iInd(elementNum)=startnum1+k1;
iInd(elementNum+1)=startnum1+k1-1;
jInd(elementNum)=startnum2+m2-1;
jInd(elementNum+1)=startnum2+m2-1;
val(elementNum)=-1;
val(elementNum+1)=1;
elementNum=elementNum+2;
H(startnum1+k1)=1
H(startnum1+k1-1)=-1
else
k2=j-varstartnum2
%J(startnum1+k1,startnum2+k2)=1
%J(startnum1+k1,startnum2+k2-1)=-1
iInd(elementNum)=startnum1+k1;
iInd(elementNum+1)=startnum1+k1;
jInd(elementNum)=startnum2+k2;
jInd(elementNum+1)=startnum2+k2-1;
val(elementNum)=1;
val(elementNum+1)=-1;
elementNum=elementNum+2;
J(startnum1+k1-1,startnum2+k2)=-1
J(startnum1+k1-1,startnum2+k2-1)=1
end
end
end
H=1/4*H*interaction(i,j);
H_prob=H_prob+H;
iInd=iInd(1:elementNum-1); % remove extra entries
jInd=jInd(1:elementNum-1); % remove extra entries
val=val(1:elementNum-1); % list of values (all ones in this case)
J=sparse(iInd,jInd,val,nqubits,nqubits);
J=1/4*J*interaction(i,j);
J_prob=J_prob+J;
end
end
回答(0 个)
类别
在 帮助中心 和 File Exchange 中查找有关 Sparse Matrices 的更多信息
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!