我试图取一个相当大的数据集的平均值,所以我已经创建了一个函数来完成它。
数据存储在一些struct1.struct2.data(:,column)
中
有4个struct1
,其中每个都有20到30个子struct2
我想要平均的数据总是存储在第7列中,我希望将每个struct2.data(:,column)
的平均值输出到2xN
数组/ double中(此输出的第1列是对每个子数据的引用) struct2
第2列是平均值)
问题是,我无法找到一种方法(很多很多阅读)来恰当地指出每个结构。我使用字符串来引用结构,但是我收到错误Attempt to reference field of non-structure array.
很明显它不喜欢这个。这是我用的。 (原谅不公平)
function [avrg] = Takemean(prefix,numslits)
% place holder arrays
avs = [];
slits = [];
% iterate over the sub-struct (struct2)
for currslit=1:numslits
dataname = sprintf('%s_slit_%02d',prefix,currslit);
% slap the average and slit ID on the end
avs(end+1) = mean(prefix.dataname.data(:,7));
slits(end+1) = currslit;
end
% transpose the arrays
avs = avs';
slits = slits';
avrg = cat(2,slits,avs); % slap them together
它落在此行avs(end+1) = mean(prefix.dataname.data,7);
,因为如您所见,prefix
和dataname
是字符串。所以,在打猎之后,我尝试用genvarname()
制作这些字符串变量仍然没有运气!
我已经花了几个小时来完成5分钟的编码。 :'(
修改:哦prefix
是一个字符串,例如'Hs'
和结构的结构(lol)例如是Hs.Hs_slit_XX.data()
其中XX
例如01,02,...27
mean(Hs.Hs_slit_01.data(:,7))
编辑:如果我只是运行_slit_XX
它运行正常......但是我无法迭代所有{{1}}
答案 0 :(得分:2)
如果您只想迭代名称为<something>_slit_<something>
的字段,则不需要prefix
字符串或numslits
。将实际结构传递给您的函数,提取所需的字段,然后迭代它们:
function avrg = Takemean(s)
%// Extract only the "_slit_" fields
names = fieldnames(s);
names = names(~cellfun('isempty', strfind(names, '_slit_')));
%// Iterate over fields and calculate means
avrg = zeros(numel(names), 2);
for k = 1:numel(names)
avrg(k, :) = [k, mean(s.(names{k}).data(:, 7))];
end
此方法使用dynamic field referencing来使用字符串访问结构中的字段。
答案 1 :(得分:0)
首先,在使用字符串构造访问变量之前,请三思而后行。
如果你真的需要它,可以使用它:
a.b=123;
s1 = 'a';
s2 = 'b';
eval([s1 '.' s2])
在你的情况下可能是这样的:
Hs.Hs_slit_01.data= rand(3,7);
avs = [];
dataname = 'Hs_slit_01';
prefix = 'Hs';
eval(['avs(end+1) = mean(' prefix '.' dataname '.data(:,7))'])