使用原始名称保存变量

时间:2013-09-30 09:42:21

标签: matlab

我写了一个简单的函数来自动保存一些名称为

的变量
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

问题是当我在工作区中再次加载变量时,他们的名字被保存为...我希望他们有原来的名字..

假设我有2个载体

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

我调用了函数

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

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

3 个答案:

答案 0 :(得分: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)
  3. 现在应该有一个文件my_sample.mat,其中包含一个10x10的随机数矩阵。您可以拨打clear,然后拨打load my_sample。然后,如果你打电话给whos,你应该得到以下输出:

      Name            Size            Bytes  Class     Attributes
    
      my_sample      10x10              800  double      
    

    或者您在问题中提供的样本的调用将是:

    savevariables(Test1,Test2)
    

答案 1 :(得分: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的变量

答案 2 :(得分:1)

您可以使用-struct功能的save选项。然后,您可以将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.matc.matd.matd1.mat和{{1 }}