我需要在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.
答案 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
有两个参数Q
和h
。后者是循环计数器,前者是您要重命名的变量。您必须为三个变量中的每一个调用此函数。这将在您的工作区中生成新变量,称为A1
或A2
或A...
,具体取决于循环计数器h
的值。
现在,当您致电save
时,您可以使用相同的逻辑调用这些新变量:['A' num2str(h)]
。请注意,您必须使用num2str
来组合循环计数器的整数值和变量的字符串值。
但是,请仔细考虑使用此方法。当您加载这些工作区文件并希望处理存储在其中的变量时,拥有名为A1
,A2
,A...
的变量可能会成为编码噩梦。