基于字符串MATLAB命名变量

时间:2014-04-11 16:24:41

标签: string matlab filenames

我有一个由循环创建的变量。变量足够大,并且形式足够复杂,我希望每次使用不同的名称从循环中保存变量。

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等,因为它已经创建。

3 个答案:

答案 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);