如何从ND数组中提取非零元素的索引?

时间:2017-06-08 17:35:07

标签: arrays matlab multidimensional-array graph matlab-figure

我需要用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转换为tlabeledge(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');

enter image description here 仅供参考:M(:,:,1)M(:,:,2)没有相同的非零条目。

1 个答案:

答案 0 :(得分:1)

一些背景洞察力:
在您的问题中,st的顺序是相互关联的,即如果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]

现在,您可以通过以下代码从以下代码中提取st并将其与您的问题中的组合结合使用:

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

现在,您可以使用digraphsnew制作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,....会很麻烦,可能没必要。

<强>输出:
通过上述修改,您将获得以下输出:

output