数组结构中的数据对应的形状

时间:2015-02-23 07:44:49

标签: arrays matlab struct vectorization

说,我们有一个结构数组

data = struct('position',[]);

data(1,1).position = 11;
data(1,2).position = 12;
data(2,1).position = 21;
data(2,2).position = 22;

我了解到要从数组中所有结构的字段中获取条目,我们可以使用

>> [data.position]

ans =

    11    21    12    22

但是这会连续提供数据。 我们怎样才能在数组的原始形状中获得它,而不在MCode中循环数组?

期望的输出:

position =

    11    12
    21    22

2 个答案:

答案 0 :(得分:3)

使用reshape。这将把输入矢量/矩阵重构为另一个所需形状的矢量/矩阵。具体来说,您可以将data的尺寸指定为reshape以及[data.position]生成的行向量,并为您重新塑造具有正确尺寸的矢量。

data = struct('position',[]);

data(1,1).position = 11;
data(1,2).position = 12;
data(2,1).position = 21;
data(2,2).position = 22;

position = reshape([data.position], size(data))

position =

    11    12
    21    22

请注意,元素的形状采用列主格式,因此值按列堆叠。如您所见,前两个元素成为输出矩阵的第一列,而后两个元素成为输出矩阵的第二列。

答案 1 :(得分:2)

如果您正在处理空条目,可以使用struct2cell将结构数据转换为单元格数组,使我们能够将空条目存储为空单元格 -

data_cell = permute(struct2cell(data),[2 3 1])

out  = data_cell(:,:,strcmp(fieldnames(data),'position'))

所以,如果你有(2,2)缺少这样的东西 -

data = struct('position',[]);
data(1,1).position = 11;
data(1,2).position = 12;
data(2,1).position = 21;

你会 -

out = 
    [11]    [12]
    [21]      []

基于@ CitizenInsane很好的观察结果,它可能非常接近@rayryeng's answer,但是处理单元格数组而不是数字数组的是 -

out = reshape({data.position}, size(data))