MATLAB符号计算赋值时矩阵尺寸不匹配,求原因与解决方法
MATLAB符号计算矩阵尺寸不匹配问题排查与解决
在MATLAB中进行符号计算时出现矩阵尺寸不匹配报错,代码及报错信息如下:
原代码
syms xi eta N1 = ((1+xi)*(1+eta))/4; N2 = ((1-xi)*(1+eta))/4; N3 = ((1-xi)*(1-eta))/4; N4 = ((1+xi)*(1-eta))/4; Nxieta = [N1 N2 N3 N4]; difNxieta = sym(zeros(2,4)) for i = 1:4 difNxieta(1,i) = diff(Nxieta(1:i),xi); difNxieta(2,i) = diff(Nxieta(1:i),eta); end
报错信息
Unable to perform assignment because the size of the left side is 1-by-1 and the size of the right side is 1-by-2. Error in sym/privsubsasgn (line 1128) L_tilde2 = builtin('subsasgn',L_tilde,struct('type','()','subs',{varargin}),R_tilde); Error in sym/subsasgn (line 965) C = privsubsasgn(L,R,inds{:}); Error in Ae420_FEA_project>localstiffnessmatrix (line 55) difNxieta(1,i) = diff(Nxieta(1:i),xi);
问题原因
报错核心是索引错误:循环中使用Nxieta(1:i)会提取数组的前i个元素(比如i=2时是[N1 N2]),对这个1×i的符号数组求导后,返回的结果是同样1×i的导数数组。而左侧difNxieta(1,i)是一个1×1的位置,当i≥2时,右侧1×2的数组无法赋值到左侧1×1的位置,因此触发尺寸不匹配错误。
你原本想取第i个元素求导,应该用Nxieta(i)而非Nxieta(1:i),前者是单个符号变量,求导后返回1×1的结果,和左侧位置尺寸匹配。
修正后的代码
syms xi eta N1 = ((1+xi)*(1+eta))/4; N2 = ((1-xi)*(1+eta))/4; N3 = ((1-xi)*(1-eta))/4; N4 = ((1+xi)*(1-eta))/4; Nxieta = [N1 N2 N3 N4]; difNxieta = sym(zeros(2,4)); for i = 1:4 difNxieta(1,i) = diff(Nxieta(i),xi); % 修正索引为单个元素 difNxieta(2,i) = diff(Nxieta(i),eta); % 修正索引为单个元素 end
内容的提问来源于stack exchange,提问作者Faito Dayo
相关产品推荐
相关产品推荐

