Matlab函数文件定义分段函数后调用变量未显示的问题问询
问题分析与解决办法
核心原因:函数的工作区隔离机制
你遇到的问题本质是MATLAB中函数和脚本的工作区差异:
- 脚本是直接在基础工作区(也就是你打开MATLAB看到的那个默认工作区)执行代码,所有变量都会直接留在基础工作区内。
- 函数有自己独立的局部工作区,执行完毕后内部变量会自动销毁,只有通过显式接收输出参数,才能把函数里的
t和v传递到基础工作区。
你现在的调用代码VPieceWise(t_start,t_end)没有接收返回值,MATLAB只会把第一个返回值t默认存到ans变量里,v根本没被传递出来,自然在工作区看不到,后面的plot(t,v)还会因为变量未定义报错。
解决方法:显式接收输出参数
只需要修改你的调用脚本,把函数的两个返回值接收下来就行:
clear all; clc; close all t_start = input('enter the start time'); t_end = input('enter the end time'); % 显式接收函数返回的t和v [t, v] = VPieceWise(t_start,t_end); plot(t,v)
这样修改后,t和v就会出现在基础工作区里,plot也能正常运行。
额外说明(不推荐的替代方案)
如果你暂时不想修改调用方式,也可以在函数内部用assignin函数把变量强制放到基础工作区,但这种方式破坏了函数的封装性,不建议在正式代码中使用:
修改后的函数代码:
function [t, v] = VPieceWise(t_start, t_end); t = t_start:0.01:t_end; for i = 1:length(t); if (t(i) >= 0) && (t(i) <= 10); v(i) = 11.*(t(i).^2) - (5.*t(i)); elseif (t(i) >= 10) && (t(i) <= 20); v(i) = 1100 - 5.*t(i); elseif (t(i) >= 20) && (t(i) <= 30); v(i) = 50.*t(i) + 2*((t(i)-20).^2.5); elseif (t(i) >= 30) && (t(i) <= 100); v(i) = 1520.*exp(-0.1.*(t(i)-30)); elseif (t(i) >= -100) && (t(i) <= 0); v(i) = 0; end end % 把变量放到基础工作区 assignin('base', 't', t); assignin('base', 'v', v); end
但还是优先用第一种显式接收输出的方式,这才是MATLAB函数设计的规范用法。
内容的提问来源于stack exchange,提问作者ads21323




