2016-10-07 3 views
0

Matlabプログラムを実行した後、各行とカラムに1つのエントリしか持たない行列が得られます。重み付き接続パスを取得するためのMATLABコード

Mat(:,:,1) = [0 0.3; 0.9 0] - stage 1 

Mat(:,:,2) = [0.7 0; 0 0.4] - stage 2 

Mat(:,:,3) = [0 0.1; 0.5 0] - stage 3 

私がある場合は(I、J)番目の位置のエントリが、この(現在)段階i番目のノードが次の(将来の)ステージのj番目のノードに接続し、エントリの値は、その経路を意味することを意味重量。例えば上記のよう

は:

Mat(:,:,1)ステージの第1ノードに接続されているステージ1の第1ノードは、ステージ2とステージ1の第2ノードの第2ノードに接続されていると言う2

Mat(:,:,2)は、第1のノードを言いますステージ2の2番目のノードはステージ3の2番目のノードに接続します。

Mat(:,:,3)ステージ3の1番目のノードはステージ4の2番目のノードとステージの2番目のノードに接続します3はステージ4の第1ノードに接続する。

その後、ステージ1ステージ4への接続パスが重みを持つとして与えることができます。

path1=[0.3, 0.4, 0.5] 

path2=[0.9, 0.7, 0.1] 

しかし、私はMatlabのコードを使用して、これらの2つのパス1とパス2ベクトルを得ることができるのか分かりません。これは2 x 2行列に対して実行する最も簡単な例ですが、実際の場合は一般的なn x n行列で、#n個の経路があります。

Mat(、、:n)行列がすべて与えられている場合、誰かがmatlabを使ってこれらのパスを得るのを手伝ってもらえますか?

+0

答えが十分に明確でない場合は教えてください。 – Tempux

答えて

1

まず、暗黙のグラフの隣接行列を作成します。

script.m

Mat = zeros(2,2,3); 
Mat(:,:,1) = [0 0.3;0.9 0]; 
Mat(:,:,2) = [0.7 0;0 0.4]; 
Mat(:,:,3) = [0 0.1;0.5 0]; 

Z = size(Mat,3); 
N = size(Mat,1); 
adjacency = zeros((Z+1) * N); 

for z=1:size(Mat,3) 
    for r=1:size(Mat,1) 
     for c=1:size(Mat,2) 
      if Mat(r,c,z) > 0 
       adjacency((z-1)*N + r , (z)*N + c) = Mat(r,c,z); 
      end 
     end 
    end 
end 

for i=1:N 
    dfs(adjacency, i, []) 
end 

dfs.m

function dfs(adj, node, path_) 
    flag = 0; 
    for i=1:size(adj,2) 
     if adj(node, i) > 0 
      flag = 1; 
      dfs(adj,i,[path_ adj(node,i)]) 
     end 
    end 
    if flag==0 
     path_ 
    end 
end 

出力

path_ = 

    0.3000 0.4000 0.5000 


path_ = 

    0.9000 0.7000 0.1000 
:次いで、第一段階からすべてのパスを見つけるためにDFSを実行
+0

これはよく@Tempuxで動作します。場合によっては、行列の行数以上の数のMat Matrix(つまり、m x n; n> = m)が必要でした。次に、各行は単一のエントリを持ちますが、異なる列にあります。コードの調整はどこで行う必要がありますか。 (申し訳ありませんが、元の質問には触れません) – Frey

+0

@Frey意味がありません。あなたの行列はN * Nでなければなりません。 – Tempux

+0

はい@Tenpux、それは私がやっていることを説明する少し難しいです。例えば1段目の#m個のノードは、2段目の利用可能な#n個のノード(n> = m)のうちの#m個のノードに接続する。 Mat出力のコードを実行すると、Mat Matrix m x nが得られますが、#(n-m)列にはゼロのエントリがあります。したがって、第2段階でそれらのノードを破棄します。ここでも、2段目の選択された#mノードは、3段目の利用可能な#nノードのうち、#m個のノードに接続する。同様にすべての#Sステージで実行し、#S Matマトリックスを取得します。私はあなたの素敵なコードの助けを借りてそれを試すかもしれません私はあなたの答えを受け入れる。 – Frey

関連する問題