Matlab:查询复杂结构

Posted

技术标签:

【中文标题】Matlab:查询复杂结构【英文标题】:Matlab: Query complicated structures 【发布时间】:2012-07-29 20:39:14 【问题描述】:

我在 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 的字段包含各种类型的元素(矩阵、结构、整数)。

我不反对完全重组我的输出,但我希望以这样一种方式完成,该组织可以相当自我评论,我可以说一年后回到这个结构并记住什么以及一切都在哪里。

【问题讨论】:

编写一个函数来处理这个很容易,但它确实需要循环。我不知道是否有任何方法可以强制数据以便 structfun() 或 struct2array() 可以发挥作用,除非我至少循环遍历 classification 的元素。 您能发布您的基于循环的函数,以及我们可以使用的最小结构数组示例吗?例如,不清楚尺寸 5 和 8 代表什么 对不起,5是statObj的元素个数,8是classification的元素个数。我的函数循环遍历 classification 的 8 个元素并将每个 .statObj.dprime 拉入一个新向量,我只是取其平均值。简单本身,但您的解决方案更好。 【参考方案1】:

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

%# 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

【讨论】:

这很棒!知道何时以及如何使用[] 来强迫事物以特定方式表现是我仍在学习的一门艺术。谢谢! @ChrisCox:也许这个doc page 可以提供一些帮助。这个post 也有一些信息。【参考方案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 结构。这是一种更通用的解决方案,更易于查询和使用。

【讨论】:

以上是关于Matlab:查询复杂结构的主要内容,如果未能解决你的问题,请参考以下文章

使用 Apache Drill 查询嵌套的复杂 json 结构

用于从具有复杂结构的表中选择数据的 sql 查询

mysql复杂查询

mysql的复杂查询,连接数据库

『数据结构』树状数组

NSPredicate 复杂查询