在MatLab中分配单元格数组中的单元格集

时间:2015-08-17 20:02:24

标签: arrays matlab

我的数据在结构中分为多种类型(取决于通常约2-3种类型)。例如,一个可能是类型A,并被引用为

import.(typeA) 

或类似

currentFields = fieldnames(import);
for i = 1:size(currentFields)
    workingField = import.(currentFields{i})
end

这让我得到了调用每个特定结构所需的内容,因为import是.json解析器的结果

如果我知道每种类型中都有X组不同的数据,我想以某种方式显示每一段数据(假设在这种情况下x = 3)

Type:    Details:
~~~~~    ~~~~~
type A    123
type A    1.23
type A    12.3
type B    abc
type B    bca
type B    cab

有没有办法调用这些并将它们放入一个不需要大量嵌套for循环的新单元格数组中,例如将它们放入矩阵中?我认为它可能是一个简单的for循环,条件来自2 :(数学运算),其中运算是计算行2 - 4用于类型A,行5 - 7用于类型B我认为像模数这样的东西会起作用,但我不确定如何实现它。

基本上,如何使用循环为每种类型的结构分配X个单元格组(在一列中),以便数据易于阅读?

Thanks in advance!

编辑:

示例数据

Struct: import
subfields: name, id, date, data [struct]

Struct: data
subfields: left handed [struct], right handed [struct]

Struct: right handed (both left and right have same subfields)
subfields: reaction time, reaction window, position is top (all are numeric values)

我希望数据看起来像这样:

ID:    Name:    Type:   Reaction T:    Reaction W:   Position is Top:
ABCD   ASH      right      123           130           0
ABCD   ASH      right      180           130           0
ABCD   ASH      left       199           210           1
ABCD   ASH      left       237           270           1

右手数据分组在第2行和第2行中。 3,左手是4& 5.它必须是可变的,因为每个数据集略有不同。

我已经完成了前3列。我最担心的是最后三个。

2 个答案:

答案 0 :(得分:1)

假设你有一个看起来像这样的结构数组

data(1).T = 123;
data(1).W = 456;
data(1).P = 789;
data(2).T = 321;
data(2).W = 654;
data(2).P = 987;

data_cell = struct2cell(data);   % Returns 3x1x2 cell array.

第一个索引是指定字段。 data(1).T对应data_cell{1,1,1}data_cell(1,1,:)对应于原始结构数组的所有成员中字段T中包含的值。注意{}和()索引。 {}返回单元格的内容,而()返回子集单元格数组

答案 1 :(得分:1)

那么,您是否以表格格式嵌套了所需的结构体?尝试以下功能。它应该与具有您描述的结构的结构一起使用,并将它们转换为Matlab“表”数据类型。我猜到了字段名称,必要时进行修改。要查看该表,请执行disp(T)。不是最优雅,但由于您的结构嵌套了未知数据字段,我不确定是否有更简单的方法。

function T = nestedStruct2Table(S)
T = table();
nRow = length(S.data.leftHanded);
for i = 1:nRow
    T.ID(i) = S.id;
    T.Name(i) = S.name;
    T.type(i) = 'leftHanded';
    T.reactionT(i)  = S.data.reactionT(i);
    T.reactionW(i)  = S.data.reactionW(i);
    T.posOnTop(i)  = S.data.posOnTop(i);
end

nRow2 = length(S.data.rightHanded);
for i = (1:nRow2) + nRow
    T.ID(i) = S.id;
    T.Name(i) = S.name;
    T.type(i) = 'rightHanded';
    T.reactionT(i)  = S.data.reactionT(i);
    T.reactionW(i)  = S.data.reactionW(i);
    T.posOnTop(i)  = S.data.posOnTop(i);
end