0

私はMatlabの使用を学んでいる新入生です。おそらくループなしでより高速な方法があると誰か教えてください。各行に1、-1の2つの値のみを大きな疎行列の異なる位置に割り当てることです。

条件の MILP 問題の bimatrix または 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

また:

% 最初に大きな疎行列を生成します。

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 秒以上かかります。より短い時間でより大きなマトリックスを生成する必要があります。

ありがとうございました。

4

1 に答える 1

3

提案:スパース行列を使用してください。

+1各行に必要な列番号を含む2つのベクトルを作成できるはずです-1vec_1これら 2 つのベクトルを と と呼びましょう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 を利用できないため、エラーがない可能性があります。

于 2013-10-04T17:49:48.157 に答える