みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

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));

これを上手くループを使って、回すことができないだろうかと思っています。

なにか良いアイデアがありましたらば、是非アドバイスをお願い致します。

投稿日時 - 2010-09-09 03:27:13

QNo.6169100

困ってます

このQ&Aは役に立ちましたか?

5人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.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

でしょうか。

投稿日時 - 2010-09-23 12:06:39

ANo.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関数を使います。しかしこれまで書くとかえってややこしくなるので、どうしてもという場合にはその旨要求して下さい。

投稿日時 - 2010-09-09 05:30:34

あなたにオススメの質問