2012-01-10 8 views
0

行列の配列(M)があります。 i番目の行列の演算を行い、(3i-1)、(3i)、(3i + 1)番目の配列に3つの行列を追加します。配列のj番目の位置に到達するまでこのプロセスを続けたいと思います。ここで、jはj + 1番目以降の位置の行列がすでに位置1と位置jの間のどこかに現れているようなものです。行列が行列内にあるかどうかをチェックする方法(Matlab)

編集:私は何を意味するかを明確にするように求められました。上記のようにアルゴリズムを終了させるコードを書くことができません。行列の配列を調べて、与えられた行列が含まれているかどうかを調べる適切な方法を知っていれば、それを行うことができます。私は、次のことを試してみました:

done = 0;  

ii = 1 

    while done ~= 1 

    %operation on matrix in ith position omitted, but this is where it goes 

     for jj = ii+1:numel(M) 

       for kk = 1:ii 
        if M{jj} == M{kk}; 
         done = done + 1/(numel(M) - ii); 
         break 
        end 
       end 
     end 

      if done ~= 1 
       done = 0; 
      end 

    ii = ii + 1 

    end 

この(私はあなたが見ることができると確信していたように)プロセスが長すぎるために行く場合、丸め誤差がこれまで= 1で行わ許可を停止することで、と私が持っている問題をアルゴリズムは終了しません。私は、しきい値を導入することにより、このラウンド取得しようとした、

while abs(done - 1) > thresh 

if abs(done - 1) > thresh 
    done = 0; 
end 

のようなものは、これは、より多くの場合、アルゴリズムの仕事になりますが、私は私のしきい値「ワンサイズで全部にフィット」がありません(プロセスは任意の段階で続けることができる)ので、やはり壊れてしまいます。

私はこれを修正するために何ができますか?あなたは0で行わ初期化しないのはなぜ

おかげ

+3

質問の内容が質問のタイトルとどのように関係しているのかよくわかりません。あなたは何を求めているのですか?また、あなたのコードを適切に再現可能にするために 'M'を提供できますか?最後に、MATLABのようなネストされたループがある場合は、通常は何か間違っていることを意味します。本当の目的を明確にして、コードを書く良い方法を見つけることをお勧めします。 –

+0

ご回答ありがとうございます。私は私の質問をより明確にするために私の投稿を編集しました。私はあなたがそれがタイトルに関連していることを見つけるだろうと思う。私はあなたが「間違っている」ことを意味するのを見落とす。私の目標は、許容できる時間内に私が望む出力を与えるアルゴリズムを書くことです。私はプログラミングに慣れていませんが、私が書いた他のほとんどのアルゴリズムでは、ネストされたループを使用して完全にうまく動作します。 –

+0

私はあまりにもタイトルがあなたが求めているものとどのように相関しているか分かりません。 「ループが正しく終了しない」などの関連性の高いものに変更した方が良いでしょう。また、関心のある人々が実際にタイトルに基づいてあなたの本当の質問を読むことから、あなたを助けるでしょう。 – Jorge

答えて

0

、行列がすでに存在する場合は、あなたの条件は(見つけているかどうかを確認、あなたの中には== 0ループを行って、代わりに要素の和として行わコンピューティングの維持これをコーディングするために、よりエレガントな方法はしかし、おそらくあり

alldone=zeros(numel(M)-ii,1); 

for jj = ii+1:numel(M) 

     for kk = 1:ii 
      if isequal(M{jj},M{kk}) 
       alldone(jj-ii) = 1 
       break 
      end 
     end 
end 
done=prod(alldone); 

:)、すべてのJJのために、このような何かを検証しています。 は、たとえば、あなたが早期終了追加することができます。各ループの開始時に

while done==0 
done=1; 
for jj = ii+1:numel(M) 
    match_success=0; 
    for kk = 1:ii 
     if isequal(M{jj},M{kk}) 
      match_success=1; 
      break 
     end 
    end 
    if match_success==0 
     done=0; 
     break; 
    end 
end 
end 

を、アルゴリズムが(それゆえ= 1行なわ)成功し、そこに停止しようとしている前提としています。次に、各jjに対して、match_successを作成します。このmatch_successは、M {jj}に一致するものが見つかった場合にのみ1に設定されます。一致が見つかった場合、私たちは壊れて次のjに行きます。 jに一致するものが見つからなければ、match_successは0のままになり、doneは0に初期化され、whileループが続行されます。私はそれをチェックしていないが、それは動作するはずだと思う。

これは単なる簡単な調整ですが、この考え方全体をさらにスピードアップする可能性があります。

+0

ありがとうございます。私はこれがなぜ優れているのか分かりますが、それでもまだ動作していない場合があります。私は "disp(alldone)"を追加し、それぞれのループは1つを除いて全てを書き換えました。浮動小数点エラーか等価なものがありますか? –

+1

あなたは2つの行列を見ることができますか?彼らは実際に同じですか?それらがほぼ同じですが、理論的には同じです(たとえば、matlabがそれぞれの計算で小さな誤差を生じ、これが非等価になる場合)、このチェックを許容誤差ベースのものに置き換えることができますノルム(M {jj} -M {kk})<ある小さな値)のようなものである。 – Theo

+0

上記のRichieのコメントに追加するだけで、ネストされたループを回避し、コード(つまり行列や配列の操作)を可能な限り並列化できない限り、Matlabはかなり遅い言語であることがわかります。時には、その方法を明確にしていない場合もありますが、コードが遅すぎると思っているときに留意すべきことがあります。 – Theo

関連する問題