3

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

功能是

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

1 回答 1

8

这是一种极端情况:您可以在 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)]

第一行包含一个元素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)]

如果您将代码粘贴到 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.

要解决这个问题,您必须告诉 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
于 2019-09-05T08:46:33.743 回答