在Matlab中保存循环内部

时间:2015-01-15 08:55:00

标签: matlab

我需要在Matlab中保存一些循环的每次迭代中创建的矩阵,使用的名称取决于循环索引h。更准确地说,代码是

for h=1:4

   A=randn(2,1);
   B=randn(2,1);
   C=randn(2,1);

save(sprintf('data%d.mat',h),'-v7.3', 'A' , 'B', 'C')

end

代表h=3, 我得到矩阵data3,其名称取决于循环索引,包含矩阵A,B,C。我希望以data3包含A3,B3,C3的方式修改该行代码。

注意:使用save(sprintf('data%d.mat',h), ['A' h], ['B' h], ['C' h] ,'-v7.3')会出现错误

Error using save
'A' is not a valid variable name.

2 个答案:

答案 0 :(得分:0)

我想知道你是否使用了正确的签名保存方法。

您工作的正确签名是:

save (filename, version, variables).

而不是save(filename, variables, version)。但是因为-v被正确解析,所以没关系。

您可以使用isvarname(字符串)

检查它是否是有效的变量名称

这应该这样做:

  save(sprintf('data%d.mat',h), ['A' h], ['B' h], ['C' h] ,'-v7.3')

如果您避免使用-v7.3会更好,因为您可能会对MAT文件的版本相关设置进行硬编码。在没有-v参数的情况下尝试使用。

但是你的矩阵是A,B和C而不是A1,B1,C1,....等等。您可以在保存方法中提供您喜欢的任何变量名称,在当前工作区中长期存在。

所有你需要的是一个字符串连接,在MATLAB中,它类似于声明一个矩阵,例如: a = ['my' 'name' 'is' 'Bolshoi']

答案 1 :(得分:0)

您必须使用local function方法(或在单独的脚本中设置变量重命名功能)才能使用assignin - 功能。
本地函数是必需的,因为您需要在caller工作空间中创建新变量。 (只有'caller''base'assignin的可能输入 - 而'base'是函数外的工作区。)
此外,您必须使用inputname - 函数来获取子函数中的实际变量名称。

function test_func

for h=1:4

    A=randn(2,1);
    B=randn(2,1);
    C=randn(2,1);

    assignVar(A,h)
    assignVar(B,h)
    assignVar(C,h)

    save(sprintf('data%d.mat',h),'-v7.3', ['A' num2str(h)], ...
                                          ['B' num2str(h)], ...
                                          ['C' num2str(h)])

end

end

function assignVar(Q,h)
    assignin('caller',[inputname(1) num2str(h)],Q)
end

函数assignVar有两个参数Qh。后者是循环计数器,前者是您要重命名的变量。您必须为三个变量中的每一个调用此函数。这将在您的工作区中生成新变量,称为A1A2A...,具体取决于循环计数器h的值。
现在,当您致电save时,您可以使用相同的逻辑调用这些新变量:['A' num2str(h)]。请注意,您必须使用num2str来组合循环计数器的整数值和变量的字符串值。


但是,请仔细考虑使用此方法。当您加载这些工作区文件并希望处理存储在其中的变量时,拥有名为A1A2A...的变量可能会成为编码噩梦。