1. ホーム
  2. arrays

[解決済み] 代入A(:)=Bにおいて、AとBの要素数は同じでなければならない

2022-02-24 19:19:58

質問

私のコードを実行しようとするとき、例えば

for ii= 1:10
   output(ii)=rand(3);
end

エラーが表示される

In an assignment  A(:) = B, the number of elements in A and B must be the same

または

In an assignment  A(I) = B, the number of elements in B and I must be the same.

このエラーは何を意味するのでしょうか?それを取り除くにはどのような方法がありますか?

解決方法は?

このエラーは、変数のチャンクに、そのサイズより多い(または少ない)値を入れようとしたために発生します。言い換えれば、次のようなステートメントがあるとします。 A(:)=B で、ここで size(A(:)) とは異なります。 size(B) .

設問の例では rand(3) が返されます。 3x3 の行列がありますが、これは output(ii) は単なる1つの値です(たとえ output の方が大きいかもしれません。 output(ii) は、あくまで一つの値であり output によって返される値です。 rand(3) に収まらない。 output .

この問題を解決するために、以下のように output という変数があるので、すべての結果を収めるスペースがあります。

これには2つの方法があります。ひとつは マトリクス というように、返り値に合うような、例えば output=zeros(3,3,10) .

そして、コードを次のように変更します。

for ii= 1:10
   output(:,:,ii)=rand(3);
end

あるいは output として セル配列 . これは,関数の戻り値が毎回変わるような場合に特に有効です。 rand(ii);

その場合、次のようにするとうまくいきます。

for ii= 1:10
   output{ii}=rand(ii);
end


質問の例とは異なり、実際のケースでは、出力が返すサイズがわからないため、2つのオプションのうちどちらを使ってコードを修正すればよいのかがわからない可能性が高いです。

それを知るための一つの方法は、コードがエラーになったときにデバッグヘルプを有効にすることで、次のように入力します。 dbstop if error をコマンドラインに入力します。これは、MATLABがエラーをスローしたときにデバッグを停止させるトリガーとなります。 size(rand(ii))size(output(ii)) をクリックすると、両者のサイズを確認できます。

多くの場合、使用する関数のドキュメントを読んで、異なるサイズが可能かどうかを確認することも役に立ちます。

とはいえ、2つ目の選択肢であるセル配列は、常にすべてのものが収まるようにします。しかし、MATLABでは一般的に行列の方が高速で使いやすいので、可能であれば行列ベースの解決策を目指すべきです。