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:查询复杂结构的主要内容,如果未能解决你的问题,请参考以下文章