作业帮 > 综合 > 作业

matlab出错 “Inner matrix dimensions must agree.”

来源:学生作业帮 编辑:百度作业网作业帮 分类:综合作业 时间:2024/05/15 05:45:21
matlab出错 “Inner matrix dimensions must agree.”
function result = XYZtoBL(X,Y,Z)
format long g
a=6378137.0000000000; %a为地球椭圆长半径
e2=0.00669438002290; %e为地球第一偏心率
%进行迭代初值赋值
if(X>0)
L=atand(Y/X);
else
L=atand(Y/X)+180;
end
B=atand(Z/sqrt(X^2+Y^2));
W=sqrt(1-e2*sin(B*pi/180));
N=a/W;
H=sqrt(X^2+Y^2)/cos(B*pi/180)-N;
M=a*(1-e2)/W^3;
k1=sin(B*pi/180);
k11=cos(B*pi/180);
k2=sin(L*pi/180);
k22=cos(L*pi/180);
JI=[k2/(N+H)*k11 k22/(N+H)*k11 0;k1*k22/(M+H) k1*k2/(M+H) k11/(M+H);k1*k2 k2*k11 k1];
U=[(N+H)*k11*k22-X;(N+H)*k11*k2-Y;(N*(1-e2)+H)*k1-Z];
T=[L;B;H];
Q=T-JI.*U;
while norm(Y-T,inf)>=0.00001
T=0.5*Q;
JI=[k2/(N+H)*k11 k22/(N+H)*k11 0;k1*k22/(M+H) k1*k2/(M+H) k11/(M+H);k1*k2 k2*k11 k1];
U=[(N+H)*k11*k22-X (N+H)*k11*k2-Y (N*(1-e2)+H)*k1-Z];
Q=T-JI.*U;
end
result=T;
result
运行结果
Error using ==> mtimesInner matrix dimensions must agree.
Error in ==> XYZtoBL at 34 Q=T-JI*U;
求大侠指教啊.
matlab出错 “Inner matrix dimensions must agree.”
1、应该把点乘(.*)改为矩阵乘(*).while语句的上面和循环体里面各有一处,都要改.不过,有点奇怪的是,你贴出来的代码里面是点乘,而下面的报错信息却是矩阵乘. 2、while循环体中的这一句    U=[(N+H)*k11*k22-X (N+H)*k11*k2-Y (N*(1-e2)+H)*k1-Z];
改成    U=[(N+H)*k11*k22-X; (N+H)*k11*k2-Y; (N*(1-e2)+H)*k1-Z];
这一点也有些奇怪:while的上面有一句是按照列向量写的,不知为什么到这里就成了行向量. 另外,JI和U在循环体内没有更新(虽然每步都计算,但值不变),是不是有问题?如果确信没问题,那么循环体里面的这两句完全可以删掉. 3、while循环的迭代本质就是    Q = 0.5*Q + e其中e=JI*U,而结束条件是 Y-0.5*Q 的范数足够小.这样的迭代看上去有点莫名其妙,是不是迭代的结束条件搞错了?
再问: 第一个问题我改正了 
第二个问题应该是列向量才对,循环体里的内容的确有重复,删掉了迭代这块我是从一篇文章里面看到的具体如下我基本上是等于不会matlab的,我看着这个流程图,自己瞎弄的,上面说的是牛顿迭代法,流程图中的不成立后T的赋值有点看不清,大侠了解牛顿迭代法么,请忙帮,谢谢。

再答: 牛顿迭代法是很简单的,你随便搜索一下就能找到相关介绍。 我看这个图里的确把JI和U放在循环体里面进行迭代的,那么它相应的公式应该和LBH有关。再回头看了一下出错之前的代码,应该是大部分都要放在循环体之内的。 不过,从图注看,“非线性”被写成了“非线形”,这种低级错误让我对这篇文章的严谨性很没信心。如果它给的某个公式是错的,就算程序调试通过,结果也可能是错的。所以,我建议你最好不要在这方面无谓地花费太多精力。 从你的要求看,是想要计算直角坐标到经纬度的转换,这方面MATLAB的地图工具箱里面有现成的函数,比自己编省事多了。