马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?我要加入
x
各位高手,有谁能帮忙指点迷津啊。小弟要生成一个large-scale的矩阵,有四层循环(中间会调用一个简单的函数)。放在matlab里做慢到要死,听说放到c或c++里会快很多,不知道有没有什么快捷的方法能将matlab里编的循环转换到上述语言里run,然后返回矩阵啊? 十万火急,哪位大侠帮帮忙啊?(其实循环不难,就是矩阵的规模太大。)
附上code
小弟在这先谢大家了!!!!!!!!!!!!
c=[];
Aeq=[];
beq=[];
A=[];
b=[];
M=0;
n=30;
var=zeros(n,(n-1)*(n-2));
for i=1:1:n
for j=i+1:1:n
M=M+cost(i,j)*0.5*(l(i)+l(j));
for k=1:1:n
if k==i||k==j
continue;
else
temp1=zeros(1,n*(n-1)*(n-2));
cl=locate(i,j,k,n);
var(i,cl)=cost(i,j)*l(k);
temp1((n-1)*(n-2)*(i-1)+cl)=1;
cl=locate(j,i,k,n);
temp1((n-1)*(n-2)*(j-1)+cl)=-1;
Aeq=[Aeq;temp1];
beq=[beq;0];
end
end
end
end
for i=1:1:n
for j=i+1:1:n
for k=j+1:1:n
temp2=zeros(1,n*(n-1)*(n-2));
cl=locate(i,j,k,n);
temp2((n-1)*(n-2)*(i-1)+cl)=1;
cl=locate(i,k,j,n);
temp2((n-1)*(n-2)*(i-1)+cl)=1;
cl=locate(j,k,i,n);
temp2((n-1)*(n-2)*(j-1)+cl)=1;
Aeq=[Aeq;temp2];
beq=[beq;1];
end
end
end
for i=1:1:n
c=[c var(i,:)];
end
c=c';
for i=1:1:n;
for j=i+1:1:n
for k=1:1:n
if k==i||k==j
continue
else
for d=1:1:n
if d==i||d==j||d==k
continue
else
temp=zeros(1,n*(n-1)*(n-2));
cl1=locate(i,j,d,n);
cl2=locate(j,k,d,n);
cl3=locate(i,k,d,n);
temp((n-1)*(n-2)*(i-1)+cl1)=1;
temp((n-1)*(n-2)*(j-1)+cl2)=-1;
temp((n-1)*(n-2)*(i-1)+cl3)=-1;
A=[A;temp];
b=[b;0];
temp=zeros(1,n*(n-1)*(n-2));
temp((n-1)*(n-2)*(i-1)+cl1)=-1;
temp((n-1)*(n-2)*(j-1)+cl2)=-1;
temp((n-1)*(n-2)*(i-1)+cl3)=1;
A=[A;temp];
b=[b;0];
temp=zeros(1,n*(n-1)*(n-2));
temp((n-1)*(n-2)*(i-1)+cl1)=-1;
temp((n-1)*(n-2)*(j-1)+cl2)=1;
temp((n-1)*(n-2)*(i-1)+cl3)=-1;
A=[A;temp];
b=[b;0];
temp=zeros(1,n*(n-1)*(n-2));
temp((n-1)*(n-2)*(i-1)+cl1)=1;
temp((n-1)*(n-2)*(j-1)+cl2)=1;
temp((n-1)*(n-2)*(i-1)+cl3)=1;
A=[A;temp];
b=[b;2];
end
end
end
end
end
end
被调用的函数:
function cl=locate(i,j,k,n)
if j<i
if k<j
cl=(j-1)*(n-2)+k;
elseif k<i;
cl=(j-1)*(n-2)+k-1;
else
cl=(j-1)*(n-2)+k-2;
end
else
if k<i
cl=(j-2)*(n-2)+k;
elseif k<j
cl=(j-2)*(n-2)+k-1;
else
cl=(j-2)*(n-2)+k-2;
end
end
end |