2017-06-08 13 views
2

有向グラフのエッジに4つの異なるラベルを付ける必要があるので、それをN * N * 4配列に格納します。 (私の実際の3次元である4と固執しましょう。)Nはグラフのノードの数です。すなわちエントリM(i、j、1)については、ノードiからノードjへのエッジを第1の種類のラベルでラベル付けする。ここで遊ぶおもちゃの例です。ND配列から非ゼロ要素のインデックスを抽出する方法は?

M(2,1,1)=1は、ノード2からノード1へのエッジにラベルテキスト 'first label'を追加することを示します。M(3,2,2)=1は、ノード3からノード2へのエッジにラベルテキスト 'second label'を追加することを示します。 3D配列はラベルの一種です。

M(:,:,1)= 0 0 0  M(:,:,2)= 0 0 1   
      1 0 1    0 0 0 
      0 0 0    0 1 0 

しかし、私はslabeledge(h,s,t,Labels)tにN * N * 4配列Mを変換する方法を知りません。 sはソースノードのインデックスであり、tはターゲットノードのインデックスです。

理想的には、これはプロットである:

s = [2 2 1 3]; 
t = [1 3 3 2]; 
G = digraph(s,t); 
figure; 
h = plot(G); 

重要な問題は、私はこのようなMから、S1、T1、S2およびT2を得ることができる方法である:FYI

labeledge(h,[2 2], [1 3], 'first label'); 
labeledge(h,[1 3], [3 2], 'second label'); 

enter image description hereM(:,:,1)M(:,:,2)には、同じ非ゼロエントリがありません。

+0

は[あなたが100な行 'labeledge(時間、書くことになり、それが100であると言います2 2]、[1 3]、 'first label');それについてあなたの計画は何ですか? –

+0

@Sardarあなたのアドバイスありがとう!編集 –

+0

待って、 'M'から隣接行列' adj'を取得したいですか? –

答えて

1

いくつかの背景インサイト:あなたの問題で
は、stの順序は、相互リンクされている、すなわちtの要素は、同じ順序でシャッフルされている場合sのシャッフルは重要ではありません。例えば;

s = [2 3 2 1]; 
t = [1 2 3 3]; 
% replaced column 2 with column 3, column 3 with column 2, and column 4 with column 3 

は、多くのそのような組み合わせがあります。

s = [2 2 1 3]; 
t = [1 3 3 2]; 
%The combination of s and t given by you 

場合は、上記の次のと同じ結果が得られます。私が示すつもりです コードが与えられたMのために、以下の組み合わせを提供します:

s = [2 2 3 1]; %named as snew in my code 
t = [1 3 2 3]; %named as tnew in my code 
%In this combination, column 3 and 4 are inter-changed (See the combination given by you) 

コード:

for k=1:size(M,3)   %Looping depending on the third dimension 
    [r,c]= find(M(:,:,k)); %Finding non-zero elements 
    %Storing the values in a cell since the number of non-zero elements in each 
    %slice of M can be different 
    s{k}=r;  t{k}=c;  
end 

上記のコードはs{1}=[2; 2]s{2}=[3; 1]t{1}=[1; 3]t{2}=[2; 3]を与えます。

組み合わせるように上記のコードからそれらを抽出することによって、あなたの質問に与えられるように今、あなたはstを見つけることができます。

snew=vertcat(s{:}); %Giving a different name to avoid confusion 
tnew=vertcat(t{:}); 

今、あなたはsnewtnewを使用してdigraphを作成し、s{1}でエッジにラベルを付けることができ、s{2}t{1}およびt{2}

エッジを標識するためには、次のループを使用することができます作るためにあまりにも多くのラベルが存在する場合

for k=1:length(s) 
    labeledge(h,s{k}, t{k}, ['label ',num2str(k)]); 
end 

これは、ラベリングの問題を解決します。ラベルをfirst,secondとすると、扱いにくく、不要になることがあります。


出力:上記の変更を加えて
、次のような出力が得られます。

output

+0

既にソートされたインデックスを持つ隣接行列があるので(つまり、[1 2 3 4 5])、最初のコードのチャンクしか使用しませんでした。つまり私は 'vertcat'を使わず、元の' plot(G) 'の後に' labeledge'を追加しました。 'labeledge'のインデックスが隣接行列のインデックスと同じではないので、これが大丈夫かどうか疑問に思っています。どういうわけかあなたのコードは私の場合には機能せず、次のように言います。 matlab.graphics.chart.primitive.GraphPlot/labeledge sとtはグラフのエッジを指定する必要があります。 –

関連する問題