在MATLAB中调试错误“正在连接的数组的维数不一致”

Sim*_*er 2 matlab

我有一个VanderPol()应该提供矢量输出的函数,但它似乎不起作用。这只是三行代码,但我似乎找不到该错误。

该功能是

function [output] = VanderPol(y, i)
    output = [y(2,i); (1-y(1,i)^2)*y(2,i) -y(1,i)];
end
Run Code Online (Sandbox Code Playgroud)

它被称为

z = [1 2 3;
    4 5 6];
VanderPol(z,1)
Run Code Online (Sandbox Code Playgroud)

我收到一条错误消息,指出VanderPol(z,1)是错误的,但没有提示原因。确切的错误消息如下所示。任何人都可以发现该错误吗?

Error using vertcat
Dimensions of arrays being concatenated are not consistent.
Run Code Online (Sandbox Code Playgroud)

hba*_*rts 5

这有点极端:您可以在MATLAB中通过用逗号,或空格分隔元素来构造数组。因此,以下方式都可以工作并给出相同的结果:

a = [1, 2, 3]
b = [1 2 3]
Run Code Online (Sandbox Code Playgroud)

在构建矩阵时,其工作原理类似,并且行之间用分号或换行隔开,即,我们具有以下等效的可能性:

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]
Run Code Online (Sandbox Code Playgroud)

现在来看您的示例:数组如下:

[y(2,i); (1-y(1,i)^2)*y(2,i) -y(1,i)]
Run Code Online (Sandbox Code Playgroud)

第一行包含一个元素y(2,i)。但是,由于这些部分之间的空间,第二行被解释为两个元素:(1-y(1,i)^2)*y(2,i)-y(1,i)。即MATLAB认为您正在像b上面一样使用空格来分隔数组的两个部分。它将输入解释如下:

[y(2,i); (1-y(1,i)^2)*y(2,i), -y(1,i)]
Run Code Online (Sandbox Code Playgroud)

如果将代码粘贴到MATLAB中,则会收到一个错误消息,提示无法在第一行中包含1个元素,在第二行中包含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.
Run Code Online (Sandbox Code Playgroud)

要解决该问题,您必须告诉MATLAB第二行中只有一个元素,由减法给出(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
Run Code Online (Sandbox Code Playgroud)