0

我试图取一组相当大的数据的平均值,所以我创建了一个函数来做到这一点。数据存储在一些struct1.struct2.data(:,column) 有 4 个中struct1,每个都有 20 到 30 个子struct2 - 我想要平均的数据始终存储在第 7 列中,我想将每个数据的平均值输出struct2.data(:,column)2xN数组/双精度数(第 1 列这个输出是对每个子struct2列的引用,第 2 列是平均值)

omly 的问题是,我找不到正确指向每个结构的方法(大量阅读)。我正在使用字符串来引用结构,但出现错误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',结构的结构(大声笑)是例如Hs.Hs_slit_XX.data()哪里XX是例如01,02,...27

编辑:如果我只是运行mean(Hs.Hs_slit_01.data(:,7))它工作正常......但是我不能遍历所有_slit_XX

4

2 回答 2

2

如果您只是想遍历名称为 pattern 的字段,则<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

此方法使用动态字段引用来访问使用字符串的结构中的字段。

于 2013-09-17T12:26:11.047 回答
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))'])
于 2013-09-17T12:02:56.217 回答