代码之家  ›  专栏  ›  技术社区  ›  SimpleProgrammer

调试三行matlab代码(无错误消息)?

  •  0
  • SimpleProgrammer  · 技术社区  · 5 年前

    我有一个功能 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.
    
    0 回复  |  直到 5 年前
        1
  •  8
  •   hbaderts    5 年前

    这有点像边缘情况:可以在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