0

私は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'

各行列で、最初の列は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 statemtnesの数が決定されていないことに注意してください(これも常に定数ではないm1とm2に依存します)

4

1 に答える 1

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

これはおそらく遅く実行され、永続変数を調べたいと思うかもしれませんが、うまくいけば、これで十分に始めることができます. (そして、再帰を終了する条件を追加することを忘れないでください)

于 2012-12-17T16:05:43.327 に答える