0

我在 Matlab 中使用结构以直观的方式组织我的结果。我的分析相当复杂且层次分明,所以这很有效——逻辑上。例如: resultObj.multivariate.individual.distributed.raw.alpha10(1).classification(1)。结构的每一层都有几个字段。每个alpha字段都是一个结构化数组,为每个数据集编制索引,classification同时也是一个结构化数组,用于在数据上运行的每个交叉验证。

为简化起见,考虑分类字段:

>> classification
ans = 

1x8 struct array with fields:
    bestLambda
    bestBetas
    scores
    statObj
    fitObj

其中statObj有字段(例如):

           dprime: 6.5811
              hit: 20
             miss: 0
      falseAlarms: 0
correctRejections: 30

当然,每个主题和交叉验证运行的字段具有不同的值。鉴于这种结构,是否有一种好方法可以在交叉验证运行(即 的元素classification)中找到 dprime 的平均值,而无需构造一个 for 循环来提取、存储和最终计算?

我希望这reshape(struct2array(classification.statObj),5,8)会起作用,所以我可以构建一个矩阵,其中统计数据作为行,交叉验证作为列运行,但这不起作用。我把这些项目放在他们自己的结构中,因为这些字段包含classification各种类型的元素(矩阵、结构、整数)。

我不反对完全重组我的输出,但我希望它以这样一种方式完成,该组织是相当自我评论的,我可以说从现在开始一年后回到这个结构并记住一切的内容和位置是。

4

2 回答 2

3

我想出了以下内容,尽管我不确定它是否是您要查找的内容:

%# create a structure hierarchy similar to yours
%# (I ignore everything before alpha10, and only create a part of it)
alpha10 = struct();
for a=1:5
    alpha10(a).classification = struct();
    for c=1:8
        alpha10(a).classification(c).statObj = struct('dprime',rand());
    end
end

%# matrix of 'dprime' for each alpha across each cross-validation run
st = [alpha10.classification];
st = [st.statObj];
dp = reshape([st.dprime], 8, 5)'    %# result is 5-by-8 matrix

接下来,您可以计算该矩阵第二维的平均值dp

于 2012-07-29T21:22:44.270 回答
2

对于发生在这篇文章中并且正在与类似的东西搏斗的任何人,值得问问自己这样的嵌套结构是否真的是您的最佳选择。扁平化层次结构并包含描述性字段作为标签可能更容易。例如

resultObj.multivariate.individual.distributed.raw.alpha10(1).classification(1)

可能反而是

resultObj(1).
    AnlaysisType    = 'multivariate'
    GroupSolution   = false
    SignalType      = 'distributed'
    Processing      = 'raw'
    alpha           = 10
    crossvalidation = 1
    dprime          = 6.5811
    bestLambda      = []
    bestBetas       = []
    scores          = []
    fitObj          = []

这不是有效的 Matlab 语法,但它是重点。与其从嵌套结构中构建层次结构,不如创建一个带有标签和数据的 1xN 结构。这是一种更通用的解决方案,更易于查询和使用。

于 2015-10-25T15:24:19.460 回答