1. ホーム
  2. matlab

[解決済み] MATLABで「連結される配列の次元が一致しない」というエラーをデバッグする。

2022-02-07 02:17:51

質問

ある関数 VanderPol() これはベクトル出力をするはずなのですが、どうもうまくいきません。たった3行のコードですが、バグを見つけることができないようです。

この関数は

function [output] = VanderPol(y, i)
    output = [y(2,i); (1-y(1,i)^2)*y(2,i) -y(1,i)];
end

と呼ばれるようになります。

z = [1 2 3;
    4 5 6];
VanderPol(z,1)

というエラーメッセージが表示されます。 VanderPol(z,1) は欠陥がありますが、理由のヒントはありません。正確なエラーメッセージは以下の通りです。どなたかこのバグを発見できる方はいらっしゃいますか?

Error using vertcat
Dimensions of arrays being concatenated are not consistent.

解決方法は?

これはちょっとエッジケースなんです。MATLABでは、要素をコンマで区切って配列を構築することができます。 , またはスペース . したがって、以下の方法はどちらも有効であり、同じ結果を得ることができます。

a = [1, 2, 3]
b = [1 2 3]

行列を作る場合も同様で、行の区切りはセミコロンまたは改行となります。つまり、次のような同等の可能性があります。

A = [1, 2, 3; 4, 5, 6]
B = [1 2 3; 4 5 6]
C = [1, 2, 3
     4, 5, 6]
D = [1 2 3
     4 5 6]

さて、あなたの例ですが、あなたの配列は次のようなものです。

[y(2,i); (1-y(1,i)^2)*y(2,i) -y(1,i)]

最初の行には、1つの要素 y(2,i) . しかし、2行目は2つの要素として解釈されます。 (1-y(1,i)^2)*y(2,i)-y(1,i) これらの部分の間にスペースがあるためです。つまり、MATLABは以下のように配列の2つの部分をスペースで区切っていると考えています。 b 上記のように それは、次のような入力を解釈します。

[y(2,i); (1-y(1,i)^2)*y(2,i), -y(1,i)]

このコードをMATLABに貼り付けると、「1行目に1要素、2行目に2要素を持つ配列は作れない」というエラーが出ます。

>> [y(2,i); (1-y(1,i)^2)*y(2,i) -y(1,i)]
Error using vertcat
Dimensions of arrays being concatenated are not consistent.

この問題を解決するには、MATLABに、2行目の要素は1つだけで、減算で与えられることを伝えなければなりません。 (1-y(1,i)^2)*y(2,i) -y(1,i) . その方法をいくつか紹介しましょう。

output = [y(2,i); (1-y(1,i)^2)*y(2,i) - y(1,i)];    % spaces on both sides of -
output = [y(2,i); (1-y(1,i)^2)*y(2,i)-y(1,i)];      % no spaces around -
output = [y(2,i); ((1-y(1,i)^2)*y(2,i) -y(1,i))];   % parentheses around everything