我是一名学习使用Matlab的新生。 任何人都可以告诉我有没有更快的方式没有循环: 为每一行只分配两个值1,-1到一个大稀疏矩阵的不同位置。
我的代码为MILP条件问题构建bimatrix或bibimatrix:
对于每个弧(i,j)和所有k~ = r,f ^ k_ {ij}< = y_ {ij};在多商品流模型中。
天真的方法:
双矩阵= [];
%创建每一行,然后添加到bimatrix
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
OR:
%首先生成大稀疏矩阵。
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)超过3秒。我需要在更短的时间内生成更大的矩阵。
谢谢。
答案 0 :(得分:3)
建议:使用sparse矩阵。
您应该能够创建两个向量,其中包含您希望每行+1
和-1
的列号。我们称这两个向量为vec_1
和vec_2
。您应该能够在没有循环的情况下执行此操作(如果没有,我仍然认为下面的过程会更快)。
让矩阵的大小为(max_row X max_col)
。然后你可以像这样创建矩阵:
bibimatrix = sparse(1:max_row,vec_1,1,max_row,max_col);
bibimatrix = bibimatrix + sparse(1:max_row, vec_2,-1,max_row,max_col)
如果你想看到整个矩阵(你没有,因为它很大)你可以写:full(bibimatrix)
。
编辑: 你也可以这样做:
col_vec = [vec_1, vec_2];
row_vec = [1:max_row, 1:max_row];
s = [ones(1,max_row), -1*ones(1,max_row)];
bibimatrix = sparse(row_vec, col_vec, s, max_row, max_col)
免责声明:我没有MATLAB,因此它可能没有错误。