在MATLAB中动态命名结构变量

时间:2015-07-06 23:23:13

标签: matlab struct naming-conventions

我有几个文件“2011-01-01.txt”,“2013-01-02.txt”,“2015-02-01.txt”等。 我希望为每个文件创建一个struct变量,以便(值组成):

machine20110101.size=[1,2,3];
machine20110101.weight=2345;
machine20110101.price=3456;

machine20130102.size=[2,3,4];
machine20130102.weight=1357;
machine20130102.price=123;

machine20150201.size=[1,2,4];
machine20150201.weight=1357;
machine20150201.price=123;

save('f20110101.mat','machine20110101');
save('f20130102.mat','machine20130102') ;
save('f20150201.mat','machine20150201');

正如我们所看到的,结构名称是从文件名称派生的。如何构造上述结构变量?

我已经搜索了一段时间,但我没有弄清楚如何使用genvarname

这些链接(dynamic variable names in matlabdynamic variable declaration function matlabDynamically change variable name inside a loop in MATLAB)无法解决我的问题。

我正在使用MATLAB R2012b,因此在此版本之后定义的matlab.lang.makeUniqueStrings等函数不可用。

2 个答案:

答案 0 :(得分:0)

现在我在MATLAB面前,这是一个基于我上面评论的示例,利用dynamic field namesfileparts中使用regexprepcellfun修剪的文件名打电话。

% Sample list for testing here, use uigetdir with dir or whatever method to
% get a list of files generically
filelist = {'C:\mydata\2011-01-01.txt', ...
                'C:\mydata\2012-02-02.txt', ...
                'C:\mydata\2013-03-03.txt', ...
                'C:\mydata\2014-04-04.txt', ...
                };
nfiles = length(filelist);

% Get filenames from your list of files
[~, filenames] = cellfun(@fileparts, filelist, 'UniformOutput', false);

% Prune unwanted characters from each filename and concatenate with 'machine'
prunedfilenames = regexprep(filenames, '-', '');
myfieldnames = strcat('machine', prunedfilenames);

% Generate your structure
for ii = 1:nfiles
    % Parse your files for the data, using dummy variables since I don't 
    % know how your data is structured
    loadedsize = [1, 2, 3];
    loadedweight = 1234;
    loadedprice = 1234;

    % Add data to struct array
    mydata.(myfieldnames{ii}).size = loadedsize;
    mydata.(myfieldnames{ii}).weight = loadedweight;
    mydata.(myfieldnames{ii}).price = loadedprice;
end

@patrik在评论中提出了一些好处。我认为他希望看到更通用的方法(请纠正我,如果我错了)就是这样的:

% Sample list for testing here, use uigetdir with dir or whatever method to
% get a list of files generically
filelist = {'C:\mydata\2011-01-01.txt', ...
                'C:\mydata\2012-02-02.txt', ...
                'C:\mydata\2013-03-03.txt', ...
                'C:\mydata\2014-04-04.txt', ...
                };
nfiles = length(filelist);

% Get filenames from your list of files
[~, filenames] = cellfun(@fileparts, filelist, 'UniformOutput', false);

% Prune unwanted characters from each filename and concatenate with 'machine'
prunedfilenames = regexprep(filenames, '-', '');
mytags = strcat('machine', prunedfilenames);

% Preallocate your structure
mydata = repmat(struct('tag', '', 'size', [1, 1, 1], 'weight', 1, 'price', 1), nfiles, 1);

% Fill your structure
for ii = 1:nfiles
    % Parse your files for the data, using dummy variables since I don't 
    % know how your data is structured
    loadedsize = [1, 2, 3];
    loadedweight = 1234;
    loadedprice = 1234;

    % Add data to struct array
    mydata(ii).tag = mytags{ii};
    mydata(ii).size = loadedsize;
    mydata(ii).weight = loadedweight;
    mydata(ii).price = loadedprice;
end

答案 1 :(得分:0)

Besides @excaza's answer, I used the following approach:

machine.size = [1,2,3]; machine.price = 335; machine.weight = 234;

machineName = ['machine',the_date];

machineSet = struct(machineName,machine);

save(OutputFile,'-struct','machineSet',machineName);