从内部函数加载.mat文件

时间:2015-01-06 12:31:56

标签: matlab

在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

2 个答案:

答案 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保留为本地函数,这会生成我相信您期待的内容。我不是语法的忠实粉丝,盲目地分配工作区变量,但它实现了目标。