我的数据在结构中分为多种类型(取决于通常约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列。我最担心的是最后三个。
答案 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