如何通过回溯Matlab中的父节点来有效地创建数组?

时间:2018-02-23 05:20:18

标签: matlab

我正在研究路径规划器算法。我有一个Nx2矩阵 NodeInfo ,它的第一列中有当前节点号,第二列中有父节点号。例如:

NodeInfo = [3,1;
            4,1;
            5,2;
            6,2;
            7,3;
            8,4;
            9,4;
           10,4;
           11,5;
           12,6;
           13,6;
           14,6;
           15,7;
           16,7;
           17,8;
           18,8;
           19,9;
           20,9;
          21,10;
          22,10;
          23,11;
          24,11;
          25,12;
          26,12];

当算法达到目标时,它输出节点号,在这种情况下为26。我正在寻找一种智能方法来跟踪父节点并创建由目标节点产生的节点数组。所以输出应该是:

Array = [26, 12, 6, 2];

谢谢!

2 个答案:

答案 0 :(得分:1)

 p = NodeInfo(end,1);
 parents = [p]
 while (~isempty(p))
  p =  NodeInfo(find(NodeInfo(:,1)==p),2)
  parents = [parents p]
 end

答案存储在parents

答案 1 :(得分:0)

下面的代码使用container,并且可能需要一些时间来构建散列映射,但是当实际存在具有大量请求的较大数据集时,它可能比std更快。

修改:在find()中添加了2个节点,以防止NodeMap函数进入状态,同时避免浪费太多时间。

isKey()

NodeMap = containers.Map(NodeInfo(:,1),NodeInfo(:,2)); %Create a container NodeMap(1)=0; NodeMap(2)=0; %Add 2 nodes nodes=zeros(1,length(NodeMap)); %pre-allocate k=2; [N,nodes(1)]=deal(26); %Init parameters while(N>0) [nodes(k),N]=deal(NodeMap(N)); k=k+1; end nodes(nodes == 0)=[] %Cleaning up & print 的输出是:

N=26

希望它有所帮助!