1

我写了一个简单的函数来自动保存一些变量的名字

function savevariables(varargin)
    %1st argument varible1, 2nd argument 'namevar1', 3rd variable2, 4th 'namevar2', etc 

    for i = 1:2: length(varargin)

        savedata = varargin{1,i};
        namedata=genvarname(varargin{i+1});
        save(strcat('/home/.../path/',namedata),'savedata')

        clear savedata
        clear namedata

    end

end

问题是,当我在工作区中再次加载变量时,它们的名称是 savedata ......我希望它们有原来的名称......

所以假设我有 2 个向量

Test1 = [1 2 3 4 5];
Test2 = [4 5 6];

我调用函数

function savevariables(Test1, 'Test1',Test2,'Test2');

我想将变量 Test1 保存为 Test1,将 Test2 保存为 Test2,这样当我在工作区中再次加载它们时,我有变量 Test1 和 Test2..

4

3 回答 3

4

有一些很好的辅助函数可以帮助你。

特别是:inputname将提取变量名称,因此您无需再次指定它。并将evalin在父工作区中执行 - 因此您无需重新分配变量。 genvarname不应该是必需的,因为无论如何您都需要提供有效的变量名。

让我给你看一个例子:

function savevariables(varargin)
for i=1:numel(varargin)
    str = sprintf('save %s %s',inputname(i),inputname(i));
    evalin('caller',str)
end

示例用法:

  1. 创建示例变量:my_sample = rand(10);
  2. 称呼:savevariables(my_sample)

现在应该有一个my_sample.mat包含 10x10 随机数矩阵的文件。你可以打电话clear,然后load my_sample。然后,如果你打电话whos,你应该得到以下输出:

  Name            Size            Bytes  Class     Attributes

  my_sample      10x10              800  double      

或者您在问题中给出的样本要求是:

savevariables(Test1,Test2)
于 2013-09-30T10:13:03.500 回答
1

你可以做到这一点,eval这从来都不是最好的选择,但我看不出有什么办法。我敢肯定有一个。但这应该有效。

function savevariables(varargin)
    %1st argument varible1, 2nd argument 'namevar1', 3rd variable2, 4th 'namevar2', etc 

    for i = 1:2: length(varargin)

        namedata=genvarname(varargin{i+1});
        filename = strcat('/home/.../path/',namedata);
        eval([namedata, ' = varargin{1,i};']);
        save(filename, namedata)

        clear savedata
        clear namedata

    end

end

调用如下:

savevariables(Test1, 'Test1', Test2, 'Test2')

然后,当load test1您将Test1在工作区中调用一个变量时

于 2013-09-30T10:01:39.913 回答
1

您可以使用-structsave功能的选项。然后你可以保存some_struct.foo为一个单独的变量foo

function savevariables(varargin)

% swap varargin(2 * k) and varargin(2 * k + 1) to use struct()
varargin = flipud(reshape(varargin, 2, []));

varargin(1,:) = genvarname(varargin(1,:));
s = struct(varargin{:});

for varname = fieldnames(s).'
  save(['/home/.../path/' varname{1}], '-struct', 's', varname{1});
end
end

如果你运行savevariables(1, 'a', 2, 'b', 3, 'c', 4, 'd', 5, 'd', 6, 'd');,你会得到六个文件a.matb.mat, c.mat, d.mat, d1.mat, 和d2.mat.

于 2013-09-30T10:41:15.647 回答