2013-10-04 67 views
0

我是學習Matlab的新生。 任何人都可以請告訴我是否有更快的方式可能沒有循環: 爲每行分配兩個值1,-1到大稀疏矩陣的不同位置。Matlab - 如果存在一種更快的方法來爲大矩陣賦值?

我的代碼來構建爲條件的MILP問題雙矩陣或bibimatrix:

˚F^ K_ {IJ} < = Y_ {IJ}對於每個弧(i,j)和所有的k〜= R;在多商品流量模型中。

天真的方法:

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)大於3s。我需要在更短的時間內生成更大的矩陣。

謝謝。

+2

該索引的邏輯是什麼? – Vuwox

+0

你的兩個循環不會產生相同的輸出。您還會說,它只包含1和-1,但大多數條目都是0.請檢查代碼是否正確並解釋您的矩陣應該是什麼樣子。 – Tim

+0

始終,始終爲您的矩陣預先分配內存! –

回答

3

建議:使用sparse矩陣。

您應該能夠創建兩個向量,其中包含您希望在每行中使用+1-1的列號。我們稱這兩個載體vec_1vec_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可用,所以它可能不是無差錯。

+0

謝謝。我正在考慮與命令sub2ind類似的方式。不知道哪一個稀疏或sub2ind會更快? – philipvn

+0

@VNese,我會把所有的錢都放在稀疏的地方。你的矩陣也非常大,所以你將使用稀疏技術節省大量內存,因爲只存儲非零元素。 –

相關問題