如何消除matlab中过多的系统if语句

如何消除matlab中过多的系统if语句,matlab,if-statement,Matlab,If Statement,我有2个单元格矩阵(来自某个代码): 在每个矩阵中,第一列是第二列的父列。。。我需要从代码中找到可以确定这些单元格之间所有关系的图形部分。。。我必须从第1列中找到发生在第2列中的单元格,然后从第1列中取第2列同一行中的单元格,并找到它与第2列中其他单元格之间的相似性。。所以。。这有点像图论中的深度优先搜索 一般来说,如何生成一个大小灵活的代码(递归),以替换以下if语句: for k=1:length(m1) for ii=1:length(m1) for j=1:length

我有2个单元格矩阵(来自某个代码):

在每个矩阵中,第一列是第二列的父列。。。我需要从代码中找到可以确定这些单元格之间所有关系的图形部分。。。我必须从第1列中找到发生在第2列中的单元格,然后从第1列中取第2列同一行中的单元格,并找到它与第2列中其他单元格之间的相似性。。所以。。这有点像图论中的深度优先搜索

一般来说,如何生成一个大小灵活的代码(递归),以替换以下if语句:

for k=1:length(m1)
for ii=1:length(m1)         
for j=1:length(m1)
for i=1:length(m2)
 for e=1:length(m1)
   if isequal(m2{i,1},m1{j,2})
      x1=[m1(j,1) m2(i,2)];
      x11=[x1;x11];
       if isequal(m1{j,1},m1{k,2})
          x2=[m1(k,1),m2(i,2)];
          x22=[x2;x22];
             if isequal(m1{k,1},m1{ii,2})
              x3=[m1(ii,1),m2(i,2)];
              x33=[x3;x33];
                 if isequal(m1{ii,1},m1{e,2})
                 x4=[m1(e,1),m2(i,2)];
                 x44=[x4;x44];
                      .
                      .
            and so..x_total=[x11;x22;x33;x44...]
end
end
end
end
end
end
end

请注意,if statemtne的数量没有确定(它取决于m1和m2,它们也不总是常数)

一般编程技巧是将循环中没有变化的语句移出循环。例如,可以将“For e=1:length(m1)”循环移动到只覆盖“if-isequal(m1{ii,1},m1{e,2})”语句。 在重新排列了if语句和循环之后,希望能够更清楚地了解如何递归地实现某些东西

for i=1:length(m2)
for j=1:length(m1)
   if isequal(m2{i,1},m1{j,2})
      x1=[m1(j,1) m2(i,2)];
      x11=[x1;x11];
      for k=1:length(m1)
       if isequal(m1{j,1},m1{k,2})
          x2=[m1(k,1),m2(i,2)];
          x22=[x2;x22];
          for ii=1:length(m1)         
             if isequal(m1{k,1},m1{ii,2})
              x3=[m1(ii,1),m2(i,2)];
              x33=[x3;x33];
              for e=1:length(m1)
                 if isequal(m1{ii,1},m1{e,2})
                 x4=[m1(e,1),m2(i,2)];
                 x44=[x4;x44];
                      .
                      .
                 and so..x_total=[x11;x22;x33;x44...]
              end
          end
      end
end
end
end
end
现在您可以看到递归函数类似于

function x_total=recursive(m1,m2,j,i)
for k=1:length(m1)
   if isequal(m2{j,1},m1{k,2})
      x=[m1(k,1) m2(i,2)];
      xx=[x;xx];
      x_total=[xx;recursive(m1,m2,k,i)];
   end
end
这可能会运行得很慢,您可能希望查看持久变量,但希望这足以让您开始。
(别忘了添加一个条件来结束递归)

一个通用编程技巧是将循环中没有变化的语句移出循环。例如,可以将“For e=1:length(m1)”循环移动到只覆盖“if-isequal(m1{ii,1},m1{e,2})”语句。 在重新排列了if语句和循环之后,希望能够更清楚地了解如何递归地实现某些东西

for i=1:length(m2)
for j=1:length(m1)
   if isequal(m2{i,1},m1{j,2})
      x1=[m1(j,1) m2(i,2)];
      x11=[x1;x11];
      for k=1:length(m1)
       if isequal(m1{j,1},m1{k,2})
          x2=[m1(k,1),m2(i,2)];
          x22=[x2;x22];
          for ii=1:length(m1)         
             if isequal(m1{k,1},m1{ii,2})
              x3=[m1(ii,1),m2(i,2)];
              x33=[x3;x33];
              for e=1:length(m1)
                 if isequal(m1{ii,1},m1{e,2})
                 x4=[m1(e,1),m2(i,2)];
                 x44=[x4;x44];
                      .
                      .
                 and so..x_total=[x11;x22;x33;x44...]
              end
          end
      end
end
end
end
end
现在您可以看到递归函数类似于

function x_total=recursive(m1,m2,j,i)
for k=1:length(m1)
   if isequal(m2{j,1},m1{k,2})
      x=[m1(k,1) m2(i,2)];
      xx=[x;xx];
      x_total=[xx;recursive(m1,m2,k,i)];
   end
end
这可能会运行得很慢,您可能希望查看持久变量,但希望这足以让您开始。
(别忘了添加一个条件来结束递归)

您能为问题中的示例
m1
m2
提供所需的输出吗?为什么有两个匹配项
m1
m2
?您的问题不明确您是否为问题中的样本
m1
m2
提供了所需的输出?为什么您有两种类型
m1
m2
?你的问题不清楚