无法执行赋值,因为左侧的大小为 2-by-1,右侧的大小为 2-by-2。

问题遇到的现象和发生背景

针对多入多出多智能体系统,设计执行器饱和情况下的紧格式动态线性化无模型自适应控制算法;仿真验证算法的有效性。

问题相关代码,请勿粘贴截图

% 控制器设计
[u1(:,k),phi1{k}]=KZ([y1(:,k) y1(:,max(1,k-1))],[y1(:,max(1,k-1)) y1(:,max(1,k-2))],xi1(:,k),u1(:,max(1,k-1)),u1(:,max(1,k-2)),phi1{max(1,k-1)},
phi1{1},eta,mu,rho1,lambda,ad(1),D(1),delr,1,k);
[u2(:,k),phi2{k}]=KZ([y2(:,k) y2(:,max(1,k-1))],[y2(:,max(1,k-1)) y2(:,max(1,k-2))],xi2(:,k),u2(:,max(1,k-1)),u2(:,max(1,k-2)),phi2{max(1,k-1)},
phi2{1},eta,mu,rho1,lambda,ad(2),D(2),delr,2,k);
[u3(:,k),phi3{k}]=KZ([y3(:,k) y3(:,max(1,k-1))],[y3(:,max(1,k-1)) y3(:,max(1,k-2))],xi3(:,k),u3(:,max(1,k-1)),u3(:,max(1,k-2)),phi3{max(1,k-1)},
phi3{1},eta,mu,rho1,lambda,ad(3),D(3),delr,3,k);

下面是出现问题的控制器
% 控制器设计
[u1(:,k),phi1{k}]=KZ([y1(:,k) y1(:,max(1,k-1))],[y1(:,max(1,k-1)) y1(:,max(1,k-2))],xi1(:,k),u1(:,max(1,k-1)),u1(:,max(1,k-2)),phi1{max(1,k-1)},phi1{1},eta,mu,rho1,lambda,ad(1),D(1),delr,1,k);
[u2(:,k),phi2{k}]=KZ([y2(:,k) y2(:,max(1,k-1))],[y2(:,max(1,k-1)) y2(:,max(1,k-2))],xi2(:,k),u2(:,max(1,k-1)),u2(:,max(1,k-2)),phi2{max(1,k-1)},phi2{1},eta,mu,rho1,lambda,ad(2),D(2),delr,2,k);
[u3(:,k),phi3{k}]=KZ([y3(:,k) y3(:,max(1,k-1))],[y3(:,max(1,k-1)) y3(:,max(1,k-2))],xi3(:,k),u3(:,max(1,k-1)),u3(:,max(1,k-2)),phi3{max(1,k-1)},phi3{1},eta,mu,rho1,lambda,ad(3),D(3),delr,3,k);

运行结果及报错内容

无法执行赋值,因为左侧的大小为 2-by-1,右侧的大小为 2-by-2。

出错 MIMO (line 91)
[u1(:,k),phi1{k}]=KZ([y1(:,k) y1(:,max(1,k-1))],[y1(:,max(1,k-1))
y1(:,max(1,k-2))],xi1(:,k),u1(:,max(1,k-1)),u1(:,max(1,k-2)),phi1{max(1,k-1)},phi1{1},eta,mu,rho1,lambda,ad(1),D(1),delr,1,k);

我的解答思路和尝试过的方法
我想要达到的结果

得知其原因,使能够顺利的跑起来程序

[u1(:,k),phi1{k}]=KZ(
    [y1(:,k) y1(:,max(1,k-1))],
    [y1(:,max(1,k-1)) y1(:,max(1,k-2))],
    xi1(:,k),
    u1(:,max(1,k-1)),
    u1(:,max(1,k-2)),
    phi1{max(1,k-1)},
    phi1{1},
    eta,
    mu,
    rho1,
    lambda,
    ad(1),
    D(1),
    delr,
    1,
    k
);

[u2(:,k),phi2{k}]=KZ(
    [y2(:,k) y2(:,max(1,k-1))],
    [y2(:,max(1,k-1)) y2(:,max(1,k-2))],
    xi2(:,k),
    u2(:,max(1,k-1)),
    u2(:,max(1,k-2)),
    phi2{max(1,k-1)},
    phi2{1},
    eta,
    mu,
    rho1,
    lambda,
    ad(2),
    D(2),
    delr,
    2,
    k
);
[u3(:,k),phi3{k}]=KZ(
    [y3(:,k) y3(:,max(1,k-1))],
    [y3(:,max(1,k-1)) y3(:,max(1,k-2))],
    xi3(:,k),
    u3(:,max(1,k-1)),
    u3(:,max(1,k-2)),
    phi3{max(1,k-1)},
    phi3{1},
    eta,
    mu,
    rho1,
    lambda,
    ad(3),
    D(3),
    delr,
    3,
    k
);

根据报错提示,你的KZ函数求出来的是一个22的矩阵,而你的左侧[u1(:,k),phi1{k}]是一个21的矩阵,因此不能把右侧的值赋给左侧。你的左侧应该使用也使用2*2的矩阵去接受函数的返回值。

从报错的结果上来看是运行的数据存储的矩阵大小不匹配,题主最好把代码完全粘贴一下,这样才能找到具体的错误是哪一步

因左右矩阵类型不匹配导致

左边为21的矩阵,右边为22的矩阵。可以检查下变量定义,是不是数目不一样。

这个问题是因为左右矩阵类型不匹配导致,设置两个相同的数据类型看一下 能否解决

出现这个报错说明矩阵左右两边元素个数不相等,我们要做的是理解两边元素个数为什么不相等,再根据情况修改。我总结了如下步骤:

定位到报错行
查看一下等号左右两边元素个数,这里通过观察可能看不出问题,可以用size函数分别查看两边元素的个数
充分理解等号左右两边变量的类型,到底是数值还是字符数组或字符串数组,有没有元胞数组等……,
搞清楚左右两边是一个完整的矩阵还是单个元素,我见过有人将矩阵和单个元素用等号连接
对容易让人混淆的情形,要着重考虑,比如代码 A = char(ones(1,10)); A(1) = '123' ,左边是字符数组A的第一个元素,该位置只能保存一个字符,而右边是一个字符数组,这个字符数组有3个元素,每个元素代表一个字符,这个操作将包含3个字符的字符数组赋值给只能包含一个字符的位置,这样一来出现“左侧和右侧的元素数目不同”的报错也属正常。修改方案A = string(ones(1,10)); A(1) = "123"这段代码将A修改为字符串数组,‘123’改为“123”,这样就将字符串保存到了字符串数组中

左边为2x1的矩阵,右边为2x2的矩阵,可以分别检查下两边的数据在哪一步变换的,改为相同的类型

如果方便的话可以将代码放在代码块里来看下吗,排版有点乱

21矩阵可以赋值给22矩阵,但是反过来不行


题主的问题和该问题相似,可以进行参考