Matlab:查询复杂结构
我在Matlab中使用结构以直观的方式组织我的结果。我的分析非常复杂且层次分明,所以这在逻辑上运作良好。例如: resultObj.multivariate.individual.distributed.raw.alpha10(1).classification(1)
。该结构的每个级别都有几个字段。每个alpha
字段是一个结构化阵列,为每个数据集编制索引,并且classification
也是一个结构化阵列,每个交叉验证对数据运行一个。Matlab:查询复杂结构
为了简化,考虑分类字段:
>> 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
的字段包含各种类型(矩阵,结构,整数)的元素,所以我将这些项目放在它们自己的结构中。
我并不是完全反对重组我的输出,但我希望这样做可以让组织完全自我评论,并且我可以说从现在开始回到这个结构并记住什么和一切都在哪里。
我想出了以下,虽然我不知道这是否是你在找什么:
%# 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-29 21:36:38
@ChrisCox:也许这个[doc page](http://www.mathworks.com/help/techdoc/matlab_prog/bs6e2p_.html)可以提供一些帮助。这[后](http://stackoverflow.com/a/4169216/97160)也有一些信息。 – Amro 2012-07-29 21:47:25
参考+1。赞赏。 – 2012-07-30 13:52:57
对于在这篇文章中发生的任何人,并且正在与类似的东西搏斗,值得问问自己,这样的嵌套结构结构是否真的是你最好的选择。扁平化层次结构并将描述性字段包含为标签可能更容易。例如
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结构。这是一个更通用的解决方案,更易于查询和使用。
编写一个函数来处理这很容易,但它确实需要循环。我不知道是否有办法强制数据,以便structfun()或struct2array()可以工作,除非我至少循环了'classification'的元素。 – 2012-07-29 21:05:33
你可以发布你的基于循环的函数,以及我们可以使用的最小结构数组例子吗?例如,它不清楚尺寸5和8代表什么 – Amro 2012-07-29 21:09:19
对不起,5是'statObj'中的元素数量,8是'classification'元素的数量。我的函数遍历'classification'的8个元素,并将每个'.statObj.dprime'拉到一个新的向量中,我只是这么说的。简单本身,但你的解决方案更好。 – 2012-07-29 21:40:19