我需要用4个不同的标签标记有向图的边缘,所以我将它存储在N * N * 4数组中。 (让我们坚持使用4,这是我的实际第三维。)N是图中节点的数量。即,对于条目M(i,j,1),我将用第一种标签标记从节点i到节点j的边缘。这是一个玩具的例子。
M(2,1,1)=1
表示我在节点2到节点1的边缘添加标签文本“第一个标签”。M(3,2,2)=1
表示我在节点3到节点2的边缘添加标签文本“第二个标签” 3D数组中的每个“页面”都是一种标签。
M(:,:,1)= 0 0 0 M(:,:,2)= 0 0 1
1 0 1 0 0 0
0 0 0 0 1 0
但我不知道如何在M
中将N * N * 4数组s
转换为t
和labeledge(h,s,t,Labels)
。 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:
labeledge(h,[2 2], [1 3], 'first label');
labeledge(h,[1 3], [3 2], 'second label');
答案 0 :(得分:1)
一些背景洞察力:
在您的问题中,s
和t
的顺序是相互关联的,即如果s
的元素也被洗牌,那么t
的改组无关紧要相同的订单。例如;如果
s = [2 2 1 3];
t = [1 3 3 2];
%The combination of s and t given by you
以上将给出与以下相同的结果:
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
有很多这样的组合。
我要展示的代码将为给定的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]
。
现在,您可以通过以下代码从以下代码中提取s
和t
并将其与您的问题中的组合结合使用:
snew=vertcat(s{:}); %Giving a different name to avoid confusion
tnew=vertcat(t{:});
现在,您可以使用digraph
和snew
制作tnew
,并使用s{1}
,s{2}
,t{1}
和{{1}标记边缘}。
为了标记边缘,您可以使用以下循环:
t{2}
如果标签太多,这就解决了标签问题。将标签设为for k=1:length(s)
labeledge(h,s{k}, t{k}, ['label ',num2str(k)]);
end
,first
,....会很麻烦,可能没必要。
<强>输出:强>
通过上述修改,您将获得以下输出: