MATLAB函数中save正常但load无法载入变量至工作区求助
我的代码如下:
if contains(p_path, 'left') save(left_path', 'a', 'b', 'c', 'd'); a = load(left_path); elseif contains(p_path, 'right') save(right_path', 'a', 'b', 'c', 'd'); b = load(right_path); end
left_path的定义(base_path示例为'C:\Users\Documents'):
left_mean_data_path = [base_path, '\left_data.mat'];
运行代码后,文件已在正确路径生成,save功能正常,但load功能异常:left_data.mat文件及变量a、b、c、d均未出现在工作区,只有手动点击该.mat文件才能将变量载入工作区。
注:上述代码不在主脚本中,而是位于函数文件内,这会是问题根源吗?
核心原因:函数工作区与基础工作区独立
MATLAB函数拥有独立的局部工作区,和命令行/主脚本使用的基础工作区完全分离。你在函数内执行a = load(left_path);时,加载的变量仅存在于函数的局部工作区,函数执行完毕后局部工作区会被销毁,变量自然不会出现在基础工作区。而手动点击.mat文件是直接加载到基础工作区,所以能看到变量。解决方法1:通过函数输出返回变量(推荐)
修改函数定义,将需要的变量作为输出参数返回,即可在基础工作区获取到这些变量。示例:function [a, b, c, d] = loadMyData(p_path, base_path) left_path = [base_path, '\left_data.mat']; right_path = [base_path, '\right_data.mat']; % 补充对应right_path定义 if contains(p_path, 'left') save(left_path, 'a', 'b', 'c', 'd'); % 移除原代码中路径后的单引号,避免转置错误 loaded_data = load(left_path); a = loaded_data.a; b = loaded_data.b; c = loaded_data.c; d = loaded_data.d; elseif contains(p_path, 'right') save(right_path, 'a', 'b', 'c', 'd'); % 移除路径后的单引号 loaded_data = load(right_path); a = loaded_data.a; b = loaded_data.b; c = loaded_data.c; d = loaded_data.d; end end调用函数时直接接收输出:
[a, b, c, d] = loadMyData(p_path, base_path);,变量会直接出现在基础工作区。解决方法2:强制加载到基础工作区(不推荐)
使用assignin函数将加载的变量直接赋值到基础工作区,这种方法会破坏函数封装性,容易引发变量冲突,仅适合临时调试:if contains(p_path, 'left') save(left_path, 'a', 'b', 'c', 'd'); % 修正路径转置问题 loaded_data = load(left_path); assignin('base', 'a', loaded_data.a); assignin('base', 'b', loaded_data.b); assignin('base', 'c', loaded_data.c); assignin('base', 'd', loaded_data.d); elseif contains(p_path, 'right') save(right_path, 'a', 'b', 'c', 'd'); % 修正路径转置问题 loaded_data = load(right_path); assignin('base', 'a', loaded_data.a); assignin('base', 'b', loaded_data.b); assignin('base', 'c', loaded_data.c); assignin('base', 'd', loaded_data.d); end额外修正:原代码的路径转置错误
原代码中save(left_path', ...)和save(right_path', ...)的单引号会将路径字符串转置为列向量,属于错误写法,必须移除单引号,改为save(left_path, ...)。
内容的提问来源于stack exchange,提问作者COTHE

