我有一个由循环创建的变量。变量足够大,并且形式足够复杂,我希望每次使用不同的名称从循环中保存变量。
PM25是我的变量。但是我想将它保存为PM25_year,其中年份根据`str = fname(13:end)'
进行更改PM25 = permute(reshape(E',[c,r/nlay,nlay]),[2,1,3]); % Reshape and permute to achieve the right shape. Each face of the 3D should be one day
str = fname(13:end); % The year
% Third dimension is organized so that the data for each site is on a face
save('PM25_str', 'PM25_Daily_US.mat', '-append')
str将是一年,就像2008年一样。所以保存的变量将是PM25_2008,然后是PM25_2009等,因为它已经创建。
答案 0 :(得分:2)
根据数据定义新变量不被视为最佳做法,但您可以使用单元格数组更有效地存储数据。您甚至可以在单个单元格中存储像PM25变量这样的大型复杂变量。以下是您可以这样做的方法:
使用循环将每年的PM25数据放入单元格数组C
:
for i = 1:numberOfYears
C{i} = PM25;
end
导致类似这样的事情:
C = { PM25_2005, PM25_2006, PM25_2007 };
现在让我们假设你想要获得2006年的变量。这很容易(假设你没有跳过几年)。您的数据的第一年将对应于位置1,第二年对应于位置2,等等。因此,要找到您想要的年份的索引:
minYear = 2005;
yearDesired = 2006;
index = yearDesired - minYear + 1;
PM25_2006 = C{index};
答案 1 :(得分:1)
您可以使用eval
执行此操作,但请注意,这通常不被视为良好做法。 eval
可能存在安全风险,因为它允许用户输入作为代码执行。更好的方法是使用单元格数组或对象数组。
那就是说,我认为这会做你想做的事情:
for year = 2008:2014
eval(sprintf('PM25_%d = permute(reshape(E',[c,r/nlay,nlay]),[2,1,3]);',year));
save('PM25_Daily_US.mat',sprintf('PM25_%d',year),'-append');
end
答案 2 :(得分:0)
我不建议设置这样的变量,因为无法跟踪这些变量并完全阻止MATLAB事先进行的各种错误检查。这种代码在运行时完全处理。
无论如何,如果您有非常这样做的理由,我建议您使用函数assignin
。
assignin('caller', ['myvar',num2str(1)], 63);