在MATLAB中动态命名结构变量 [英] Dynamically name a struct variable in MATLAB

查看:589
本文介绍了在MATLAB中动态命名结构变量的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I have several files "2011-01-01.txt", "2013-01-02.txt", "2015-02-01.txt", etc. I wish to create a struct variable for each of the file such that (the values are made up):

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

如我们所见,结构名称是从文件的名称派生的.如何构造以上结构变量?

As we can see, the struct names are derived from the files' names. How can I construct the above struct variables?

我已经搜索了一段时间,但是我不知道如何使用genvarname.

I've searched for a while, but I didn't figure out how to use genvarname.

这些链接( matlab中的动态变量名称)不能解决我的问题.

And these links (dynamic variable names in matlab, dynamic variable declaration function matlab, Dynamically change variable name inside a loop in MATLAB) didn't solve my problem.

我正在使用MATLAB R2012b,因此在此版本之后定义的matlab.lang.makeUniqueStrings之类的功能不可用.

I'm using MATLAB R2012b, so functions like matlab.lang.makeUniqueStrings defined after this version is unavailable.

推荐答案

现在我站在MATLAB的前面,下面是一个基于我上面的评论的示例,该示例利用了 呼叫.

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在评论中提出了一些好的观点.我认为他想看到的更通用的方法(如果我错了,请纠正我)是这样的:

@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

这篇关于在MATLAB中动态命名结构变量的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆