如何在matlab中摆脱太多系统的if语句

时间:2012-12-17 11:39:48

标签: matlab if-statement

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

  m1 = GO:0008150'    'GO:0016740'
      'GO:0016740'    'GO:0016787'
      'GO:0016787'    'GO:0006810'
      'GO:0008150'    'GO:0006412'
      'GO:0016740'    'GO:0004672'
      'GO:0016740'    'GO:0016779'
      'GO:0016787'    'GO:0004386'
      'GO:0016787'    'GO:0003774'
      'GO:0016787'    'GO:0016298'
      'GO:0006810'    'GO:0016192'

  m2 ='GO:0008150'    'GO:0016787'
      'GO:0008150'    'GO:0006810'
      'GO:0006810'    'GO:0006412'
      'GO:0016192'    'GO:0003774'
      'GO:0006810'    'GO:0005215'
      'GO:0005215'    'GO:0030533'

在每个矩阵中,第一列是第二列的父级...我需要从代码中找到图形的一部分,它可以确定这些单元格之间的所有关系...我必须从第1列中找到单元格在第2列中出现,然后从第1列获取单元格,但是从第2列的同一行中获取它,并在第2列中找到它与另一个单元格之间的相似性...等等......它就像图论中的深度优先搜索< / p>

一般情况下,我如何制作一个可以替换以下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 statemtnes的数量(取决于m1&amp; m2,它们也不总是常量)

1 个答案:

答案 0 :(得分:3)

一般编程技巧是将循环中没有变化的语句移出循环。例如,您的“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

这可能会运行缓慢,您可能希望查看持久变量,但希望这足以让您入门。 (并且不要忘记添加条件来结束递归)