【发布时间】:2013-10-04 16:06:26
【问题描述】:
我是一名学习使用 Matlab 的新学生。 谁能告诉我有没有更快的方法可能没有循环: 为每一行分配两个值 1, -1 到一个大稀疏矩阵的不同位置。
我为 MILP 条件问题构建双矩阵或双矩阵的代码:
f^k_{ij}
天真的方法:
双矩阵=[];
% 创建每一行然后添加到双矩阵
newrow4= zeros(1,n*(n+1)^2);
for k=1:n
for i=0:n
for j=1: n
if j~=i
%change value of some positions to -1 and 1
newrow4(i*n^2+(j-1)*n+k)=1;
newrow4((n+1)*n^2+i*n+j)=-1;
% add to bimatrix
bimatrix=[bimatrix; newrow4];
% change newrow4 back to zeros row.
newrow4(i*n^2+(j-1)*n+k)=0;
newrow4((n+1)*n^2+i*n+j)=0;
end
end
end
end
或者:
% 先生成大稀疏矩阵。
bibimatrix=zeros(n^3 ,n*(n+1)^2);
t=1;
for k=1:n
for i=0:n
for j=1: n
if j~=i
%Change 2 positions in each row to -1 and 1 in each row.
bibimatrix(t,i*n^2+(j-1)*n+k)=1;
bibimatrix(t,(n+1)*n^2+i*n+j)=-1;
t=t+1
end
end
end
end
在Matlab中使用上面的这些代码,生成这个n~12的矩阵的时间超过3s。我需要在更短的时间内生成更大的矩阵。
谢谢。
【问题讨论】:
-
该索引的逻辑是什么?
-
您的两个循环不会产生相同的输出。你也说它只包含 1 和 -1,但大多数条目都是 0。请检查代码是否正确并解释你的矩阵应该是什么样子。
-
始终,始终为您的矩阵预分配内存!
-
@RobertP。他做到了。检查第一行。他创建了零矩阵。
-
@AlexandreBizeau,我不敢苟同。您对
bibimatrix的看法是正确的,但我看不到bimatrix的初始化位置...
标签: performance algorithm matlab for-loop