Matlab函数输入参数不识别:未定义变量'r'报错求助
问题分析与解决办法
错误核心原因
你遇到的“Unrecognized function or variable 'r'”错误,本质是函数逻辑矛盾+调用方式错误:函数声明要求外部传入r和a,但内部又通过Excel读取数据覆盖这两个变量;如果直接运行函数文件而不传参数,Matlab就找不到声明的输入变量r。此外代码存在变量冲突:输出参数b被中间的矩阵变量重复赋值,会导致逻辑混乱。
具体修复步骤
修复1:统一数据来源(二选一)
选项A:依赖Excel文件读取数据(无需外部传参)
删除函数声明中的输入参数,让函数内部直接从文件获取数据:
% 去掉输入参数r和a,因为内部从文件读数据 function [x,y,m0,m1,m2,D1,D2,V,b]=engg287_201034628_a2_radar2() [num]=readmatrix('a2_radar_data.xls'); r=num(:,2); a=num(:,3); % 后续代码不变(需配合变量冲突修复)
修改后直接运行函数即可,不需要传入任何参数。
选项B:依赖外部传入r和a(不用读取Excel)
删除读取Excel的代码行,保留输入参数,调用时传入正确向量:
function [x,y,m0,m1,m2,D1,D2,V,b]=engg287_201034628_a2_radar2(r,a) % 删除以下三行读取文件的代码 % [num]=readmatrix('a2_radar_data.xls'); % r=num(:,2); % a=num(:,3); g=9.81; x=r.*cosd(a); y=r.*sind(a); % 后续代码不变(需配合变量冲突修复)
调用示例:
% 先从文件读取数据,再传入函数 num = readmatrix('a2_radar_data.xls'); r_input = num(:,2); a_input = num(:,3); [x,y,m0,m1,m2,D1,D2,V,b] = engg287_201034628_a2_radar2(r_input, a_input);
修复2:解决变量冲突
输出参数b和中间的矩阵变量重名,会导致数据覆盖,将中间矩阵变量改名(比如改为b_vec):
% 原代码 % b(1,1)=sum(y); % b(2,1)=sum(x.*y); % b(3,1)=sum(x.^2.*y); % 修改为 b_vec(1,1)=sum(y); b_vec(2,1)=sum(x.*y); b_vec(3,1)=sum(x.^2.*y); P=M\b_vec; % 这里同步改为b_vec
完整修复代码示例(以选项A为例)
function [x,y,m0,m1,m2,D1,D2,V,b]=engg287_201034628_a2_radar2() [num]=readmatrix('a2_radar_data.xls'); r=num(:,2); a=num(:,3); g=9.81; x=r.*cosd(a); y=r.*sind(a); N=length(x); M(1,2)=sum(x); M(1,3)=sum(x.^2); M(1,1)=sum(x); M(2,2)=sum(x.^2); M(2,3)=sum(x.^3); M(3,1)=sum(x.^2); M(3,2)=sum(x.^3); M(3,3)=sum(x.^4); b_vec(1,1)=sum(y); b_vec(2,1)=sum(x.*y); b_vec(3,1)=sum(x.^2.*y); P=M\b_vec; error_vec=y-(P(1) + P(2)*x + P(3)*x.^2); J=sum(error_vec.*error_vec); m0=P(1); m1=P(2); m2=P(3); r1=(-m1 + sqrt(m1^2 - 4*m2*m0))/(2*m2); r2=(-m1 - sqrt(m1^2 - 4*m2*m0))/(2*m2); D1=min(r1,r2); D2=max(r1,r2); D=D2; tanb=-m1-2*m2*D; b=atand(tanb); V=sqrt(-0.5*g*(1+tanb)/m2); figure(1) plot(x,y); xlabel('x [m]'),ylabel('y [m]') title('Conversion from (range,elevation) to (x,y)') grid X=linspace(min(D1,D2),max(D1,D2),50); Y=m0 + m1*X + m2*X.^2; figure(2); plot(X,Y,'-',x,y,'gs'); title('Trajectory Estimate') xlabel('x [m]'),ylabel('y [m]') end
内容的提问来源于stack exchange,提问作者dan7886
相关产品推荐
相关产品推荐

