0

Matlabでは非常に新しいので、私は通常STATAを使用します。隣接行列からベクトルを加算して行列に値を代入する

nchoosek fuctionを使用して、1つの行列のベクトルの合計を取得します。

私は入力として0または1のいずれかを持つ21x21隣接行列を持っています。私は新しいマトリクスを作りたいと思っています。それは隣接マトリクスからの全てのトライアドの間に入力の合計を与えます。

新しいマトリックスには、21x21の各組み合わせに対応するインデックス(i、j、k)の4つの変数があります。そして、入力の合計である最終的な変数。

私がこれまで持っているコードは次のとおりです。「:」演算子

C = nchoosek(21,3) 
B = zeros(nchoosek(21,3), 4) 
for i=1:C 
    for j=i+1:C 
     for k=j+1:C 
      B(?)=B(i, j, k, A(i)+A(j)+A(k)) #A is the 21x21 adj mat 
     end 
    end 
end 

は私がのインデックスの役割を理解して完了していないとして、私の代入文が間違っている知っています。どんな助けもありがとう。

ありがとうございます!

+3

あなたはすべての可能なトライアドの行または列を合計したいですか?または、マトリックス内の441要素のすべての可能な組み合わせを合計したいですか?マトリックスが小さい例では、この疑問がより明確になります – anyanwu

答えて

0

これは、あなたが望むものであるかもしれない:異なる組み合わせのため

  • あなたのループ:

    clear all 
    close all 
    clc 
    
    A = rand(21,21); % Replace this with actual A 
    rowNum = 0; 
    for i=1:21 
        for j=i+1:21 
         for k=j+1:21 
          rowNum = rowNum+1; 
          B(rowNum,:) = [i, j, k, sum(A(:,i)+A(:,j)+A(:,k))]; 
         end 
        end 
    end 
    

    は、いくつかのポイントがあります。組み合わせの総数はnchoosek(21,3)であり、3回のネストループの後にチェックすることができます。 for i=1:Cのコードは、iの異なる値とjkという異なる値で実際にループしているため、最初のエラーでした。したがって、これらの21の値はそれ以上ではありません。

  • 繰り返しの組み合わせを避けるには、コード内で認識していた前のインデックスの後に新しいインデックスを開始すれば十分です。
  • ベクトル化された形式のような他の方法もありますが、あなたのアプローチに固執するために、ループカウンタでありループに沿って更新されるcounter:rowNumを使用しました。
  • B(たrowNumは、:)手段行列B以下
0

のrowNum'th行のすべての要素は、隣接行列でトライアドを見つけるためのアルゴリズムです。可能なすべてのトライアドをチェックし、値を合計します。

%basic adjacency matrix with two triads (1-2-5) (2-3-5) 
A=[]; 
A(1,:) = [0 1 0 0 1]; 
A(2,:) = [1 0 1 0 1]; 
A(3,:) = [0 1 0 0 1]; 
A(4,:) = [0 0 0 0 1]; 
A(5,:) = [1 1 1 1 0]; 
A=A==1; %logical matrix 

triads=nchoosek(1:5,3); 
S=nan(size(triads,1),4); 
for ct = 1:size(triads,1) 
    S(ct,1:3)=[A(triads(ct,1),triads(ct,2)),A(triads(ct,1),triads(ct,3)),A(triads(ct,2),triads(ct,3))]; 
    S(ct,4)=sum(S(ct,1:3)); 
end 
triads(find(S(:,4)==3),:) 

ans =

1  2  5 
2  3  5 
関連する問題