在Matlab中,我在init()
内放置了一个小函数"init.m"
,用于加载我启动matlab时所需的所有数据。加载的文件包括.mat
个文件和.png
个文件。要加载.png
文件,将调用另一个函数importfile(filename)
。当我将这两个函数放在单独的文件中时,一切都很好。但是,当我将第二个函数放在文件"init.m"
中,并从命令行调用init()
时,只有png出现在我的工作区变量中。我知道.m
文件中的第一个函数是主函数,其他函数被认为是局部函数。
任何人都可以解释这种行为吗?我习惯使用C ++,精确理解Matlab如何处理文件中的路径,工作空间和多个函数会很有帮助。
以下是相关功能:
function init()
cd('~/thesis/data/');
files = dir('*.mat');
for i=1:length(files)
disp(files(i).name);
load(files(i).name);
end
importfile('./K2.png');
end
function importfile(fileToRead1)
%IMPORTFILE(FILETOREAD1)
% Imports data from the specified file
% FILETOREAD1: file to read
% Auto-generated by MATLAB on 06-Jan-2015 12:10:28
% Import the file
rawData1 = importdata(fileToRead1);
% For some simple files (such as a CSV or JPEG files), IMPORTDATA might
% return a simple array. If so, generate a structure so that the output
% matches that from the Import Wizard.
[~,name] = fileparts(fileToRead1);
newData1.(genvarname(name)) = rawData1; %#ok<DEPGENAM>
% Create new variables in the base workspace from those fields.
vars = fieldnames(newData1);
for i = 1:length(vars)
assignin('base', vars{i}, newData1.(vars{i}));
end
end
答案 0 :(得分:0)
道歉,答案包含在(MATLAB自动生成的)代码中:
% Create new variables in the base workspace from those fields.
vars = fieldnames(newData1);
for i = 1:length(vars)
assignin('base', vars{i}, newData1.(vars{i}));
end
如果我把它放在一个单独的函数中,代码也会失败;因为matlab认为这个环境是本地的,所以只是没有将它放在一个函数中。
答案 1 :(得分:0)
load()
仅将数据加载到您的函数工作区。如果您自己init()
,我假设您将其设为script而不是function。
e.g。
% Script
cd('~/thesis/data/');
files = dir('*.mat');
for i=1:length(files)
disp(files(i).name);
load(files(i).name);
end
importfile('./K2.png');
VS
function init()
% Function
cd('~/thesis/data/');
files = dir('*.mat');
for i=1:length(files)
disp(files(i).name);
load(files(i).name);
end
importfile('./K2.png');
end
脚本的工作空间是基础MATLAB工作空间,因此它可以按预期运行。当更改为函数时,它会将数据加载到函数工作区,并在函数完成执行时将其丢弃。图像仍然正确加载的原因是因为您明确地将其分配给基础工作区。
要解决此问题,您可以将init()
更改为:
function init()
% Function
cd('~/thesis/data/');
files = dir('*.mat');
for i=1:length(files)
disp(files(i).name);
evalin('base', strcat('load(''', files(ii).name, ''')'));
end
importfile('./K2.png');
end
并将importfile
保留为本地函数,这会生成我相信您期待的内容。我不是语法的忠实粉丝,盲目地分配工作区变量,但它实现了目标。