• 締切済み

Matlab のループ文について質問です。

Matlab のループ文について質問です。 (プログラミングも) Matlab初心者なのですが、あるプログラム内においてループを作りたく、試行錯誤を繰り返していますが、上手くいきません。 class1_1 = numel(find(Z1==1)); class1_2 = numel(find(Z1==2)); class2_1 = numel(find(Z2==1)); class2_2 = numel(find(Z2==2)); このような関係式が、Z3、Z4、・・・・と増えていくと、それに従って式の数も増えつづけます(Z15まであります)。 class1_1 = numel(find(Z1==1)); class1_2 = numel(find(Z1==2)); class1_3 = numel(find(Z1==3)); class1_4 = numel(find(Z1==4)); class2_1 = numel(find(Z2==1)); class2_2 = numel(find(Z2==2)); class2_3 = numel(find(Z2==3)); class2_4 = numel(find(Z2==4)); class3_1 = numel(find(Z3==1)); class3_2 = numel(find(Z3==2)); class3_3 = numel(find(Z3==3)); class3_4 = numel(find(Z3==4)); class4_1 = numel(find(Z4==1)); class4_2 = numel(find(Z4==2)); class4_3 = numel(find(Z4==3)); class4_4 = numel(find(Z4==4)); これを上手くループを使って、回すことができないだろうかと思っています。 なにか良いアイデアがありましたらば、是非アドバイスをお願い致します。

みんなの回答

  • sgwjn
  • ベストアンサー率70% (47/67)
回答No.2

単純に考えれば、Zがn個とすると Z = {Z1;Z2;...;Zn}; for i = 1:n   for j = 1:n     class(i, j) = numel(find(Z{i}==j));   end end でしょうか。

  • ciel_bleu
  • ベストアンサー率41% (66/160)
回答No.1

Zが15まであるということですが、ご質問のように、ループ処理を使って、しかも出力側の変数名をすべて異なった名前にしたいなら、eval関数を使うしか方法はないかと思います。 ただ、ご質問のとおりにZ=15まで処理をすると変数が300個以上できますね。workspace内に300個以上の変数ができるのはPCのスペックが相当よくないと、その後の処理に時間がかかるか、あるいはメモリ不足でスクリプトが進まない可能性が出てくると思いますので、cellを使って処理した方が良いかと思います。 まずはZ1からZ15をひとつの変数(cell)に収めます。 次に空セルを1*15の配列で作成します。 {1,1}のセルにはZ=1の結果が1*1で、{1,2}のセルにはZ=2の結果が2*2で、{1,5}のセルにはZ=5の結果が5*5で・・・というようにループ処理で結果をcellに入れていきます。 もしもfind(Z==x)の結果がベクトルならば、cellの中にさらに{x*x}でcellを作れば解決します。 スクリプトは以下のような感じです。 x=cell(1,15); for i=1:15; xx = cell(i,i); for j=1:i; for k = 1:i; xx(j,k)=find(z{j}==k); end end x(i)=xx; end ------- 上のスクリプトは、find関数の結果がベクトルだった場合のものなので、もしもfindの結果が一つの数値に決まる場合にはわざわざcellの中にcellを作らない方がいいです。 もし、どうしてもすべてを別の名前の変数にしたい場合には、eval関数を使います。しかしこれまで書くとかえってややこしくなるので、どうしてもという場合にはその旨要求して下さい。

関連するQ&A

  • matlabについて教えてください

    プログラミング初心者です。matlabについて教えてください いまmatlabのプログラム上に、x, y, z, という、それぞれ5行1列の変数があります。 これらをまとめて、linuxのテキストエディタ(geditなど)で読み込める1つのファイルを作りたいと思っています。 作りたいファイルは、1列目にx、2列目にy、3列目にz の値が並んでいるような感じです。 どうかやり方を教えて下さいますようお願いします。

  • 普通のfor文が無限ループになってしまうことはあるのでしょうか?

    C#のプログラミングで for (int i = n; i < n + 2; i++) { .,......... } のような普通のfor文が無限ループになってしまっていて困っています。 何か書き方が悪いのか、それともVISUAL STUDIOやパソコンの調子が悪いのでしょうか?? 教えてください。 ちなみにnは-9E17くらいのすごく小さな数です。

  • Matlab初心者です.

    Matlab初心者です. プログラムを実行したところ以下のようなメッセージが表示されました. Maximum number of function evaluations exceeded; increase options.MaxFunEvals 最大数を増やすのだと思いツールボックス→Optimization→Optimizationツールから最大数を増やしたものの何も変わりませんでした. 分かるかたいらっしゃいましたらご教授お願いいたします.

  • matlabできる方教えてください

    matlab初心者です。 入力信号(sin波)に階段波形をかけるプログラムをかきたいのですが、うまくいきません。 以下は、私がかいたプログラムです。 わかる方がいらっしゃいましたら回答宜しくお願いします。 clear all;close all; fs= 250; t_l=[0 1]; t=t_l(1)+1/fs:1/fs:t_l(2); X = sin(2*pi*2*t); Y = sin(2*pi*10*t); Z = stairs(X).*Y; figure stairs(t,Z)

  • for文を使って。

    プログラミングを勉強している初心者ですが、以下の問題につまずいてしまいました。 「10000以下の任意の数を入力して、10000からその数を引くことのできる回数を調べるプログラムを作成せよ。」 for文とデクリメント演算子を使ってつくろうとしているのですが…。 詳しいアドバイスお願いします!!

  • 数値計算ソフト「MATLAB」について

    私は今大学生で、つい先日数値計算ソフト「MATLAB(マトラボ)」をのライセンスを購入し、さまざまなプログラムを実行しています。 しかし、当然ですが大規模なプログラムになればなるほど計算の実行時間が長くなってしまいます。 プログラムのループ文の見直しなどを行って計算の高速化を図ってみたりしましたが差は微々たるものでした。 なので、PCのスペックのほうを上げていきたいと思いました。 そこでみなさんにお聞きしたいのですが、 (1)MATLABの計算はサーバーPCとクライアントPC、どちらのスペックに依存しているのでしょうか。 (2)計算速度を速めるとしたら、どの部分の性能を一番高めるべきでしょうか。(例:CPU、メモリなど) どなたかお分かりになる方がいましたら、(1)(2)どちらか片方だけでも良いですので回答宜しくお願い致します。

  • MATLABについてお聞きしたいです。

    MATLABについてお聞きしたいです。 現在勉強しているのですが、プログラミング初心者なので…。 MATLABでwavファイルの書き込みについてです。 周波数1000Hz, 0.5秒,サンプリング周波数22050Hz の設定にしてwavファイルで保存したく… f=1000; > A=0.5; > Fs=22050; > wavwrite(MyFunc_2(1000,0.5,22050),'sin1000'); という設定にして、保存したのですが、録音時に流れた音と録音された音が違うのです。 ファンクションMファイルは… function y=MyFunc_2(f,A,Fs) %Fs=44100; d=1/Fs; t=0:d:2; %f=440; %A=0.1; y=A*sin(2*pi*f*t); wavplay(y,Fs) このような設定にしています。 問題解決への協力よろしくお願いします。

  • matlab制御文での値の格納?

    現在matlabを使用してfor文で1から3000まで繰り返し、sigmaを求めるというプログラムを作っているのですが、うまくいきません。これだとn=3000のsigmaの値しかでてきません。sigmaにfor文で繰り返し求めたすべての値を格納したいです。初心者で低レベルな質問ですみません。どなたか教えていただけませんか。 sigma=0; for n=1:3000, if n <=300 dsig=1; elseif n <= 950 dsig=-1; elseif n <= 1700 dsig=1; elseif n <= 2550 dsig=-1; elseif n <= 3000 dsig=1; end sigma =sigma + dsig; end

  • while文を使うと思うのですが・・・。

    プログラミングを独学でやっている初心者です。 以下の問題でつまずきました。 「単細胞生物が翌日までに2分裂して2細胞になるとする。1匹も死なないとすると、細胞数が1万匹を超えるのは何日目になるかを算出するプログラムを作成せよ。」 実行結果を 『15日目に16384個の細胞数になります。』としたい。 while文を使うと思うのですが、どう作成したらよいのか…。 詳しい方、よろしくお願いします。

  • MATLAB - 3D Matrix の体積を計算したいのですが…

    こんにちは。 Matlab初心者のArkaといいます。先輩方に指導を頂けたらありがたいです。 現在あるデータをMatlabを使って分析し、サンプルに含まれる化学物質が何であるかを明確にするのと、どれだけの化学物質が含まれているかを推測しようとしています。集められたデータは3Dなのですが、一旦エクセルに2Dデータとして保存されます。データはこんな感じです(実際はもっと大きい行列です)。 0 1 2 0 -0.0050 -0.0049 0.02 -0.0049 -0.0043 0.04 -0.0038 -0.0035 0.08 -0.0042 -0.0034 0.12 -0.0052 -0.0089 データをエクセルでプロットすると、これに近いものが出てきます(私のものではありません)。 http://www.freepatentsonline.com/7067800-0-large.jpg それを(:,:,2)を使って3Dに変えて、データの中からそれぞれのピークの極大値を探し出し、ピークの体積を推測したいのです。ピークの極大値は化学物質を特定するのに使われ、体積はどれだけの化学物質が存在するのかを表します。 インターネットや本等で調べたり、数学、統計学、地理学などを専門とされている方々に尋ねたりしたのですが、特にいいアイデアが見つかりませんでした。 簡単に言いますと、式のない、行列から作り出された3Dグラフから極大値を特定し、それに伴う体積の計算をMatlabにプログラムしたいのですが、何かいいアイデアはないでしょうか。 説明するのが難しいので、「おい、何言ってるのか分からないぞ」と言う方は、分からない所をご指摘いただけるとありがたいです。

専門家に質問してみよう