重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

【GOLF me!】初月無料お試し

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

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

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

A 回答 (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

でしょうか。
    • good
    • 0

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

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!