Dynamically name a struct variable in MATLAB

僤鯓⒐⒋嵵緔 提交于 2019-12-02 09:35:31

Now that I'm in front of MATLAB, here's an example based on my comment above, utilizing dynamic field names with the filenames pruned using fileparts and regexprep in a cellfun call.

% 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 raises some good points in the comments. I think the more generic method he would like to see (please correct me if I'm wrong) goes something like this:

% 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

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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!