2012-07-29 91 views
0

我在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的字段包含各种类型(矩阵,结构,整数)的元素,所以我将这些项目放在它们自己的结构中。

我并不是完全反对重组我的输出,但我希望这样做可以让组织完全自我评论,并且我可以说从现在开始回到这个结构并记住什么和一切都在哪里。

+0

编写一个函数来处理这很容易,但它确实需要循环。我不知道是否有办法强制数据,以便structfun()或struct2array()可以工作,除非我至少循环了'classification'的元素。 – 2012-07-29 21:05:33

+0

你可以发布你的基于循环的函数,以及我们可以使用的最小结构数组例子吗?例如,它不清楚尺寸5和8代表什么 – Amro 2012-07-29 21:09:19

+0

对不起,5是'statObj'中的元素数量,8是'classification'元素的数量。我的函数遍历'classification'的8个元素,并将每个'.statObj.dprime'拉到一个新的向量中,我只是这么说的。简单本身,但你的解决方案更好。 – 2012-07-29 21:40:19

回答

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

+0

这工作得很好!知道什么时候以及如何使用''''或'{}'强迫某些事物以特定方式行事是我仍然在学习的一门艺术。谢谢! – 2012-07-29 21:36:38

+1

@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

+0

参考+1。赞赏。 – 2012-07-30 13:52:57

1

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

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结构。这是一个更通用的解决方案,更易于查询和使用。