You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 21:21:49