根据另一列将列的元素分配到矩阵中

时间:2016-01-06 03:40:17

标签: matlab matrix

我需要帮助编写执行以下操作的脚本:

data = [1 1 2; 
        2 1 3; 
        3 3 4; 
        3 3 5; 
        4 3 6]

脚本需要检查第二列中的数字是否重复。下面的草图解释了我想要实现的目标:

enter image description here

对于第二列中的每个重复值,我希望第三列中的所有值共享第二列中的每个重复值作为正确列中的条目,如果不重复该值则说明2 ---> 4作为一个例子,脚本将需要检查数字2是否属于前一层,如果是这样,来自它的任何数字将属于下一层

Shai提供的脚本解决了上述问题

虽然现在是分支编号的步骤,但需要在远离根(节点1)的层中对分支进行编号,如下图所示。只有在前一层中的所有分支都已编号后,一层中分支的编号才会开始。然而,考虑到发束结构作为径向电分布式发电系统,在进行反向扫描迭代时(计算每个节点的电流)。脚本如何判断例如节点8和5之间的line7,其中5也是line4等的一部分......?欢迎任何专家建议 enter image description here

1 个答案:

答案 0 :(得分:1)

希望我帮到你了

data = [1 1 2; 2 1 3; 3 2 4; 4 3 5; 5 3 6; 6 4 7;7 5 8];
mx=max(data(:,3)); %// maximal node index

估算每个节点的图层(节点1位于图层0中):

ly = zeros(mx,1); 
for ii=2:mx, 
    ly(ii) = ly( data( data(:,3)==ii, 2 ) )+1; %// get the layer of the parent
end

查看每个节点的层索引(ly):

0     1     1     2     2     2     3     3

现在我们根据图层

将节点拆分为列
for ci=1:max(ly), 
    c{ci} = find(ly==ci); %// put all nodes of layer ci in a cell
end; 

结果矩阵中的行数等于具有最大节点数的层:

mxc = max(cellfun(@numel,c));

构造结果

res=zeros(mxc,max(ly));
for ci=1:numel(c), 
    res(1:numel(c{ci}),ci)=c{ci}(:);
end;

结果是:

res =

 2     4     7
 3     5     8
 0     6     0