Matlab报错求助:赋值右侧非单例维度多于左侧非单例下标
解决Matlab报错:"Assignment has more non-singleton rhs dimensions than non-singleton subscripts"
嘿,这个报错我太熟了!说白了就是你在给变量或者数组元素赋值的时候,右边的值的维度和左边要接收的位置的维度完全对不上。举个简单例子:你想给一个单个的数组元素T(1,1)赋值,结果右边塞了个20×20的完整温度矩阵,这肯定会炸;或者左边是一维数组,右边是二维数组,维度不匹配都会触发这个错误。
结合你给出的热传导代码片段来看,前面的参数定义(比如Lx、Ny、alpha这些)都是标量,暂时不会出问题,但后面的Fo = alpha*deltaT./d...被截断了,推测你后面应该是在做有限差分的温度场更新——这也是这类报错最常出现的环节。
给你列几个你大概率会踩的坑,以及对应的解决思路:
- 坑1:更新温度场时维度不匹配
比如你定义了T = zeros(Nx,Ny);,然后直接写T = T(2:end-1,2:end-1) + Fo*(...);——左边是Nx×Ny的矩阵,右边却是(Nx-2)×(Ny-2)的内部节点矩阵,维度差了一圈,自然报错。
修正方法:先搞个临时矩阵存新温度场,再给内部节点切片赋值:T_new = T; % 先复制当前温度场 % 只更新内部节点,维度匹配 T_new(2:Ny-1, 2:Nx-1) = T(2:Ny-1,2:Nx-1) + Fo*(... T(3:Ny,2:Nx-1) + T(1:Ny-2,2:Nx-1) + T(2:Ny-1,3:Nx) + T(2:Ny-1,1:Nx-2) - 4*T(2:Ny-1,2:Nx-1)... ); T = T_new; % 最后统一替换成新温度场 - 坑2:不小心把标量运算搞成了数组运算
比如计算Fo的时候,如果dx不小心变成了数组(比如你之前误操作定义了dx为矩阵),那Fo也会变成矩阵,后面和温度场运算时就容易出现维度不匹配。你可以先检查size(Fo),确保它是标量(输出1 1)。
最后给你个快速定位错误的小技巧:
Matlab报错时会直接告诉你错误发生在第几行,直接跳过去,分别用size()函数查看赋值语句左右两边的维度——比如size(左边变量)和size(右边变量),一看就知道哪里维度对不上了。如果没看到行号,就把代码拆成小段逐步运行,找到触发错误的那几行。
内容的提问来源于stack exchange,提问作者Kappa
相关产品推荐
相关产品推荐

