MATLABで連番処理をする方法

このQ&Aのポイント
  • matalabで画像処理をしたいのですが、同じ処理を複数回、違う変数に対して行いたいのですがやり方がよくわからりません。
  • for文を使って連番処理を行いたい場合、num2strを使って変数を文字列に変換して処理することで実現できます。
  • 具体的には、下記のようにforループを用いて処理を行います。 for NUM=1:10 [outputNUM ,model_colorNUM] = func_AAAA( imgdata,centerNUM); end
回答を見る
  • ベストアンサー

MATLAB で 連番処理をしたい

matalabで画像処理をしたいのですが、 同じ処理を複数回、違う変数に対して行いたいのですがやり方がよくわからりません。 たとえば、 [output1 ,model_color1] = func_AAAA( imgdata,center1); [output2 ,model_color2] = func_AAAA( imgdata,center2); … [output10 ,model_color10] = func_AAAA( imgdata,center10); というようなことを行いたいのですが、 いちいち全部記述すると output5までしかいらない時にわざわざ6~10を消さなければならないので for文を使って書けるようにしたいと考えています イメージとしては下のように処理したいのですがこれでは当然エラーになります。 for NUM=1:10 [outputNUM ,model_colorNUM] = func_AAAA( imgdata,centerNUM); end num2strを使えばできそうな感じがするのですがどのようにすればよいでしょうか? お願いします

質問者が選んだベストアンサー

  • ベストアンサー
  • m0r1_2006
  • ベストアンサー率36% (169/464)
回答No.1

cell array を使って, for NUM=1:10 [output{NUM} ,model_color{NUM}] = func_AAAA( imgdata,center{NUM}); end こんな感じに書けば,loop できる doc の matlab-> Programing -> Data Types -> Cell Arrays 辺りを参考にすること.

yoyoyo1028
質問者

お礼

ありがとうございまうす! 無事にできました!

その他の回答 (1)

  • Kules
  • ベストアンサー率47% (292/619)
回答No.2

まあ全ての出力を別々の変数に出そうとすると変数の数がエライことになるので、 No.1の方が書かれているようにセル配列に入れるのが楽なんでしょうが、 あくまでも別々の変数に、ということであればevalを使うのがいいでしょう。 eval関数はeval('String')の形で使い、文字列をそのまま実行します。 例えば、eval('a=1+2;')とすれば、a=3になります。 よって、今回で言えば eval(['[output' num2str(1) ',model_color' num2str(1) '] = func_AAAA( imgdata,center' num2str(1) ');']); とすれば、 [output1 ,model_color1] = func_AAAA( imgdata,center1); を実行したのと同じ結果が得られます。 また、わざわざnum2strを使って文字列をつないで行くのがめんどくさければ、 sprintfを使って文字列を生成してやるという手もあります。 参考になれば幸いです。

yoyoyo1028
質問者

お礼

eval関数など まだまだ知らない関数がmatlabにはたくさんあるようですね… 回答ありがとうございます!

関連するQ&A

  • こんな処理は可能ですか?(動的な命名)

    以下のように、switchでnumの値を分岐させてその値ごとに tmp[j][i]に格納する変数を変えたいのですが、こういうことはもっと スマートにできないでしょうか? int num = (ランダムな数取得); for ( int j = 0; j < 100; j++ ){   for ( int i = 0; i < 100; i++ ){     switch ( num ){     case 1: tmp[j][i] = num1[j][i]; break;     case 2: tmp[j][i] = num2[j][i]; break;     case 3: tmp[j][i] = num3[j][i]; break;      ・      ・      ・     }   } } ーーーーーーーーーーーーーーーーーーーーーーーーーーーーー 上のコードを int num = (ランダムな数取得); char *str = "num"; strcat( str, (char *)num ); //文字列の連結 tmp[j][i] = (*str)[j][i]; 見たいな雰囲気でスマートにできるのではないかと思ったのですが・・。 動的な関数呼び出しとか##演算子とかそういうのと組み合わせてこんなことは 実現できないでしょうか?

  • matlabでfor文を使ってwork spaceの変数名を変えたい場

    matlabでfor文を使ってwork spaceの変数名を変えたい場合はどうすればよいですか? 例えばwork spaceにa1,a2,a3,a4,a5いう行列を持つ変数があり、 それぞれの行列から2行目を全部取り出したい場合どうすればよいですか? ファイル名ならfor文で作れるのですが、変数名にはfor文は使えないのでしょうか? ファイル名ならstrcatやnum2strを使って作れますが・・・。 どなたかご教授ください!

  • 処理のしくみがわかりません・・・

    以下のスクリプトはfor文による繰り返し処理の例です。 <script type="text/javascript"> <!-- var a="あ"; var b=new Array("い","う","え","お"); function FUNC1(){ for(i=0;i<b.length;i++){ a=a+b[i]; } document.write(a); } function FUNC2(){ for(i=0;i<b.length;i++){ document.write(a=a+b[i]); } } //--> </script> FUNC1の関数を実行すると、「あいうえお」、 FUNC2の関数を実行すると、「あいあいうあいうえあいうえお」 と表示されるのは理解できます。 それで試しにこのスクリプトの最後に、 FUNC1()+FUNC2(); を追加したところ、 「あいうえおあいあいうあいうえあいうえお」 と表示されると思いきや、 「あいうえおあいうえおいあいうえおいうあいうえおいうえあいうえおいうえお」 と表示されました。 どうもFUNC2を足す時、グローバル変数 a が "あ" ではなく、 "あいうえお" と代入されて実行されてるみたいです。 そして、FUNC1、FUNC2を実行すると、それぞれ 「あいうえおいうえおいうえお」 「あいうえおいうえおいあいうえおいうえおいうあいうえおいうえおいうえあいうえおいうえおいうえお」 と、理解不能の文字の並びになってしまいました。 なぜ FUNC1()+FUNC2(); を追加したらそれぞれの関数の実行値が変わってしまったのでしょうか? その処理の仕組みをご教授お願いいたします<(_ _)>

  • javascriptのレキシカルスコープについて

    JSのレキシカルスコープがわかりません。 JSだと、一番外側のスコープで var str = "一番外側のスコープ"; とすると それ以降、ユーザー定義関数の中の、いわゆる関数スコープ内でも var str; と関数内で再定義しない限り、str = "一番外側のスコープ";を つかいまわすことになりますよね? 一度、関数内で、値を変更すると親スコープでもその変更が生きたままになると思います。 var str ="一番外側のスコープ"; function test(){ alert(str); str ="値の変更"; } alert(str) // 関数内で値をかえたけど、それが親スコープにも反映されてしまう。 このことがレキシカルスコープでしょうか? ただ、どこかのサイトで var num = 100; function makefunc() { return function() { alert(num); } } function callfunc() { var num = 50; var func = makefunc(); func(); }; callfunc(); でmakefunc()関数を呼び出した際の 関数内のnumという変数の値が100になるというのです。 実際、実行するとその通りなのですが、 var num = 50; という宣言は、callfunc() という関数の関数スコープ(ローカルスコープ) というのは理解しています。 でその中のいわゆる内部関数というのでしょうか? var func = makefunc(); func(); を実行した際の 変数numというスコープが 一番最初に宣言した  var num = 100; という値をさすというのです。(※そのサイトではこれをレキシカルスコープと呼んでいました) いったどういう動作がレキシカルスコープなのでしょうか? 他にも、クロージャともごっちゃになっております。 識者の方ご教授ください。 参考元はここです http://garden-place.jp/tech/javascript/scope-chain.html

  • 外部テキストの値を得るには?

    フラッシュ初心者&質問するのが初めてなので うまく伝わるかどうか心配ですがよろしくお願いいたします。 外部テキストnum.txtにはstr=5という記述があります。 このnum.txtを取り込んで、 5という数値をflash側で変数aaaに代入しました。 --------------------------- var vars = new LoadVars(); vars.load("num.txt"); vars.onLoad = function(num){ if(num){ aaa= vars.str; trace(aaa); } } --------------------------- この場合、ちゃんと5と出力されます。 しかしこの関数内のaaaという変数を他でも利用したいのです。 (例えばvar menu_num:Number = aaa;というように) 単純に下のように記述すると --------------------------- var vars = new LoadVars(); vars.load("num.txt"); vars.onLoad = function(num){ if(num){ aaa= vars.str; } } var menu_num:Number = aaa; trace(menu_num); --------------------------- undefinedが出力されます。 この時にちゃんと5と出力させるにはどうしたらいいのでしょうか。 いろいろグローバル変数など勉強しましたがうまくいきません。 ちなみに外部テキストnum.txtのstr=5というのは、 5という数字のみでもかまいません。 とにかくテキストから数値を取り出す方法を考えています。 ご回答お願いいたします。

    • ベストアンサー
    • Flash
  • C言語の関数ポインタのイメージで処理させるには?

    いくつも条件分岐があり、配列?テーブル?か何かに 登録しておいて、対応づけにより、C言語の関数ポイン タのように処理をしたいのですが、どう記述すれば いいのでしょうか。 例えば、変数$stool が”kitte”の場合は、関数 func_kitte()を呼び、変数$stool が"hagaki"の場合 関数func_hagaki()を呼び出したいのです。 この条件が300個以上あり、全部if~elsif文で 記述するより、配列か何かに登録する方が効率的だと 思ったからです。よろしくお願いします。

    • ベストアンサー
    • Perl
  • プログラミングについての質問

    C言語において、区分求積法・台形公式・シンプソンの公式を行いたいのですがうまくいきません。 1/1+x*xを求めたいと思います。以下が途中まで作ったプログラムです。 #include <stdio.h> #define FROM 0.0 #define TO 1.0 double func(double x) { double out; out = 1.0 / ( 1.0 + x * x ); return (out); } double kubun(double start, double end, int num) { int i; double h, s; h = ( end - start ) / num; s = 0.0; for(i=0; i<num; i++) s += func( start + i * h + h / 2.0 ); return ( s * h ); } double daikei(double start,double end,int num) { int i; double h,s; h = ( end - start ) / num; s = 0.0; for(i=1; i<num-1; i++) s += func( i * h ); return ((start / 2.0 + s + end / 2.0) * h ); } double simpson(double start,double end,int num) { int i; double h,s; h = ( end - start ) / num; s = 0.0; for(i=1; i<num-1; i++) if(i%2 == 0){ s = 2 * func(i * h); }else{ s = 4 * func(i * h); } return ( (start + s + end) / 3 ); } 区分求積法はあったていると思いますが、不安なのでのせときます。 よろしくお願いします。

  • value="<%=date25(25は変数です)%>"値を変数にしてデータを受け取りたい

    いつもお世話になっております。 ASPのプログラミングの最中、データの受け取りを関数で行おうとした所 ソースの記述が分からなくなったので質問した次第です。 お手数をおかけしますが、アドバイスお願いいたします ※質問概要  あらかじめ入力していたデータを  value="<%=date値%>(値=1~26)で受け取り、内容をHTMLに表示しようと思っています。 値の変数は「num」  一件だけならば value="<%=date10%>" と入力して  「2008/08/29」日付を取得、HTMLに記述させられるのですが  関数で、複数件(26件)処理するとなると  変数名1~26の処理をnumに置き換えて  26個のテキストBOXにそれぞれのデータを出力したいのですが  どの様に記述すればいいでしょうか? (value="<%=date<%=num%>%>"にしましたが、データの取得は出来ませんでした。  value="&lt;%=date<%=num%>%&gt;"も  テキストBOXに<%=date1%>~26出力されて取得できませんでした)  説明不足の点がありましたら、即追加いたします。  以上、よろしくお願いいたします。 ソースを記載いたします <!-- カレンダー設置関数 --> <% Function cal(num)   Dim a   Dim str %>   <input type="text" name="date<%=num%>" id="date<%=num%>" onClick="cal<%=num%>.write(); <%  a = 2    Do Until a > 26     if a <> num then %>      cal<%=a%>.hide(); <%   Else     End if      a = a + 1     Loop     Response.Write str     Response.Write " "" " %>    onChange="ca<%=num%>.getFormValue(); cal<%=num%>.hide();" value="&lt;%=date<%=num%>%&gt;"【問題の箇所です】>     <br>     <div id="caldiv<%=num%>"></div> <% End Function%>

  • MATLAB ベクトル化(functionの繰り返

    MATLAB Lのプログラムを組んでいます。 for loop では実行時間が長すぎるため、改善したいです。そこでベクトル化を思いつきましたが、「functionの実行を繰り返す」場合の書き方がいまいち分からないので、教えていただきたいです。 元のループ処理は以下の通りです。 for n= 1:length(MeasuredData) SimulatedDataSet(n) = func1(param1(n), param2(n), param3(n)); end 宜しくお願い致します。

  • コンストラクタでvar ?

    javascriptのコンストラクタについて。 下記のコードで、変数を2つ宣言しています(★)が、 下部のfor文で、その変数名を引数のstr,numにすれば、★での宣言は不要ですか? 宣言しとくと何かメリットがあるのでしょうか? var Repeater = function(str, num){ var string = str, //★ number = num;     //★ this.repeat = function (){ var i, result = ""; for(i = 0; i < number; i++ ) { result += string; } return result; }; }; new Repeater("abc", 3).repeat(); あるサイトから引用