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

使用字符串引用结构数组-matlab,matlab,Matlab,我试图获取一组相当大的数据的平均值,所以我创建了一个函数来实现这一点。 数据存储在一些struct1.struct2.data(:,列) 共有4个struct1,每个都有20到30个子struct2 我想要平均的数据总是存储在第7列中,我想将每个struct2的平均值输出到2xNarray/double中。数据(:,column)(此输出的第1列是对每个子struct2的引用,第2列是平均值) 最糟糕的问题是,我找不到一种方法(大量阅读)正确地指向每个结构。我使用一个字符串来引用结构,但我得到错

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

最糟糕的问题是,我找不到一种方法(大量阅读)正确地指向每个结构。我使用一个字符串来引用结构,但我得到错误
尝试引用非结构数组的字段。
显然它不喜欢这样。这是我用过的。(请原谅我的失礼)

它落在这一行
avs(end+1)=平均值(prefix.dataname.data,7)
因为正如您所看到的,
前缀
数据名
是字符串。因此,在四处搜寻之后,我尝试使用
genvarname()
创建这些字符串变量,但仍然没有成功

我花了数小时编写了5分钟的代码:(

编辑:Oh
prefix
是一个字符串,例如
Hs'
,结构的结构(lol)是例如
Hs.Hs\u slit\u XX.data()
其中
XX
是例如
01,02,…27


编辑:如果我只是运行
mean(Hs.Hs\u slit\u 01.data(:,7))
它工作得很好…但是我不能迭代所有
\u slit\u XX

首先,在使用字符串构造访问变量之前要三思

如果您真的需要它,以下是如何使用它:

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

如果您只想在名称模式为
\u slit\u
的字段上迭代,则不需要
前缀
字符串或
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

此方法用于使用字符串访问结构中的字段。

当您说“有4个
struct1
,每个都有20到30个子
struct2
”时,你说的是结构数组,还是不同名称的单独字段?我不确定。基本上,添加的示例
Hs
是一个1x1结构,但包含
Hs_slit_XX
-每个
Hs_slit_XX
包含一个23x8双名数据和23x6名为文本数据的单元格为什么要传递结构I的名称首先是结构本身吗?因为我需要能够迭代所有类似命名的子结构…是的。所以它必须是
XX.XX______y.data(:,7)
我不知道在matlab中迭代名称的其他方法:(很酷,我会尝试它可能会工作,但对于大型数组来说,速度会非常慢。我尝试了
avs(end+1)=mean(eval([前缀]“dataname.”data(:,7));
但它给出了一个错误
未定义的变量“Hs”或类“Hs.Hs\u slit\u 01.data”.
@FriskyGrub这并不奇怪,在您的示例中,您为函数提供的唯一输入是
prefix
numslits
。如果出现错误,您可以使用
dbstop查找此类内容。
@DennisJaheruddin我尝试了
eval('avs(end+1)=平均值('prefix''dataname'。数据(:,7)))
但我只得到了
意外的MATLAB表达式
hahaddin没有检查性能,但是确保名称包含
\u slit\u
的一个更简单的方法是
names=names(stratch(''u slit\u',names))
——如果您只想使用现有的名称(我认为情况就是这样)而这种方法绝对比字符串构造更受欢迎。这看起来很有希望(而且更快),我会给它一次机会并向您介绍最新情况。是的!!!!先生,您是一个传奇!-是的,它比字符串构造快约30%(大约1秒而不是3秒)-谢谢!!!喝杯网络啤酒吧me@FriskyGrub很乐意帮忙!:)@DennisJaheruddin实际上我已经将
regexp
替换为
strfind
,但是我忘了更新答案。谢谢你的建议。
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