使用字符串来引用结构数组 - matlab

时间:2013-09-17 11:56:11

标签: matlab

我试图取一个相当大的数据集的平均值,所以我已经创建了一个函数来完成它。 数据存储在一些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);,因为如您所见,prefixdataname是字符串。所以,在打猎之后,我尝试用genvarname()制作这些字符串变量仍然没有运气!

我已经花了几个小时来完成5分钟的编码。 :'(

修改:哦prefix是一个字符串,例如'Hs'和结构的结构(lol)例如是Hs.Hs_slit_XX.data()其中XX例如01,02,...27 mean(Hs.Hs_slit_01.data(:,7))

编辑:如果我只是运行_slit_XX它运行正常......但是我无法迭代所有{{1}}

2 个答案:

答案 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))'])