2012-01-04 43 views
0

行列Aが与えられると、[B C] = MyFunction(A)という2つの行列BとCを出力する関数(名前はMyFunction)を作成しました。Matlabで1つの入力と2つの出力を持つ関数を反復する際の問題

行列Aが与えられたときにMyFunction(A)を計算し、MyFunction(B)= [DE]とMyFunction(C)= [FG]を計算し、 MyFunction(D)、MyFunction(E)、MyFunction(F)、MyFunction(G)などのように、出力される行列が繰り返されるまで繰り返されます。私はこのプロセスが必ず終了することを知っています。

私は実際にこのコードを作成するのが難しいです。どんなアドバイスも本当に感謝しています。

+0

を与え、あなたは何を試してみましたか?それのどの部分が機能していないようですか?あなたはすべてのステップの出力を保存する必要がありますか? –

+0

あなたは関数の行列の固定点を探していますか? http://en.wikipedia.org/wiki/Fixed_point_(mathematics) –

+0

私の関数は行列Aをとり、その「いとこ」BとCを出力します。私はAのいとこ、そのいとこなどを探しています –

答えて

0

EDIT:書き換え間違っALG

function [list] = newFunction(A) % returns all matrix generated matrix 

list{1}=A; 

done=0; 
ii = 1; 

while(~done) 
    [B C] = myFunction(list{ii}); 
    list = list{list{:}, B, C}; 

    for jj=1:numel(list)-2 
     if(all(all(list{jj}==B)) || all(all(list{jj}==C))) 
      done = 1; 
     end 
    end 

    ii=ii+1; 
end 

end 

UPDATE:を出力未知の数を処理するために、より一般的な方法を変更することですmyFunctionであり、単一のセルベクトル内のすべての行列を出力する。このようにしてリストを連結することができます:

[newMat] = myFunctions(list{ii}); % where newMat={B,C,...} 
list = {list{:}, newMat{:}}; % or list=cat(2,list,newMat) 

for jj=1:numel(list)-numel(newMat) 
    for nn=1:numel(newMat) % checking for repetitions 
     if(all(all(list{jj}==newMat{nn}))) 
      done=1; 
     end 
    end 
end 
+0

彼はすべての行列を前もって持っていません。それらは関数呼び出しによって生成されます。 –

+0

が修正されました。次回はもっと慎重に読むことをお勧めします:P – Batsu

+0

ありがとう、これは参考になります。 myFunctionが0,1,2または3のいずれかの行列を出力する場合、これを変更する最も簡単な方法は何ですか? –

0

私はあなたが、細胞を使うべきだと思う:

function [B]=Myfunction(A) 
    B=cell(1,numel(A)*2); 
    for n=1:numel(A) 
    B{n}=func1(A{n}) %%% put some processing here 
    B{numel(A)+n}=func2(A{n}) %%% put some other processing here 
    end 
end 
+0

これは、ベクターとは対照的に、セル配列を出力するMyFunctionコードを編集したものです。私の主な問題は、すべての出力でMyFunctionを反復するプログラムを概念的に構築する方法です。 –

+0

セルを使用して反復することができるはずです。 – Oli

+0

あなたが何を意味するのかよく分かりません。私はMatlabを新しくしました(一般的なコーディング) –

1

私はあなたがしようとしているのはバイナリツリー再帰です。特に、このプロセスの結果としてあなたが望むものを知らなくても、問題の詳細を知らなくても良い解決策を提供することは難しいです。

私はこれを使って、これをどのように行うことができるかの例を挙げました。すべての結果がすべてのステップで保存されるため、必ずしも最も効率的ではありません。入力行列Aが与えられると、2出力関数[B, C] = MyFunction(A)が計算され、isequal(A, B)またはisequal(A, C)のいずれかが検索されます。これが起こると、そのポイントでツリーの深さ、すなわち反復が起こるまでに何回反復が行われなければならなかったかを出力する。グローバル変数を持つビットはちょうど私が簡単な固定点(k番目の反復はちょうどA^k)で簡単な例を行うことができるようになっています。最大10回反復されます。だから、

function depth = myRecursor(A) 

global A_orig; 
A_orig = A; 

depth = 1; 
max_depth = 10; 

pvs_level = cell(1); 
pvs_level{1} = A; 


while depth < max_depth, 
    this_level = cell(2*length(pvs_level), 1);  
    for ix = 1 : length(pvs_level), 
     [B, C] = MyFunction(pvs_level{ix}) 
     if isequal(B, A) || isequal(C, A), 
      return; 
     end 
     this_level{2*ix - 1} = B; 
     this_level{2*ix} = C; 
    end 
    depth = depth + 1; 
    pvs_level = this_level; 
end 

function [B, C] = MyFunction(A) 

global A_orig; 

B = A_orig*A; 
C = 2*A; 

、例えばmyRecursor(eye(2))は1(当たり前)を与えるとmyRecursor([0 1; 1 0])は2

+0

ありがとうございます - これは私が慣れていたよりも先進的です。私の頭を丸めるために少し時間がかかるかもしれない –

関連する問題