每次组合以不同顺序获取的数据

时间:2017-01-23 17:42:12

标签: matlab loops

所以我从iPad应用程序中获得了一些数据,这些数据创建了一个名为subj的单元格数组,这样在subj我可以访问我的iPad游戏中的结果。我有40个人的结果。如果我输入subj{1}.correct,它会向我提供30个问题的结果 - 1或0,如果它们是正确/错误的,1 x 30矩阵,对于主题1.如果我键入subj{1}.stimulus它告诉他们提出了什么问题。共有30个问题,但每个人都是以随机顺序收到的。如何获得带有主题编号,结果和所有排序的1个矩阵,以便按问题排序#?

如果我每次手动更改subj号码,此代码有效,那么如何为所有40位参与者循环播放该号码?

  C1 = subj{1}.correct
  C1 = C1'
  S1 = subj{1}.stimulus 
  S1 = S1'
  S1 = sort(S1)
  A1 = table(C1,S1);
 %count, n, subj - will be in workspace

以下是我尝试循环的内容,但它不起作用:(

for n = 1:40;
    A{n} = subj{n}.correct
    B{n} = A{n}'
    C{n} = subj{n}.stimulus 
    D{n} = C{n}'
    E{n} = table(B{n},D{n})
end

这是一个错误:

  

将单元格内容分配给非单元格数组对象。

1 个答案:

答案 0 :(得分:2)

上述代码的直接问题是您必须拥有一个名为ABCDE的变量您的工作区已经完成,因此分配失败。为了确保没有发生这种情况,您可以在循环之前预先分配这些变量

A = cell(size(subj));

我想要的是先在第一个主题上使用unique获取所有刺激的列表

stimuli = unique(subj{1}.stimulus);

我们可以将其用作"参考订单"刺激,并确保所有其他科目按此顺序排序。

然后我会预先分配你的结果矩阵并用一个简单的循环填充它,我们使用ismember来确定哪个刺激列在哪里(second output给我们这个索引)和然后使用它来重新排序correct字段。得到的矩阵将为nSubjects x nStimuli,并且刺激的顺序与上面的stimuli相同。

results = false(numel(subj), numel(stimuli));

for k = 1:numel(subj)
    [~, inds] = ismember(subj{k}.stimulus, stimuli);
    results(k,:) = subj{k}.correct(inds);
end

如果您希望输出位于table,则可以使用array2table进行转换

T = array2table(results, 'VariableNames', stimuli);