MATLAB:根据特定条件将变量从表复制到结构

时间:2016-02-06 13:24:27

标签: matlab matlab-struct

我有一张桌子

column1data = [11; 22; 33];
column2data = [44; 55; 66];
column3data = [77; 88; 99];
rows = {'name1', 'name2', 'name3'};
T = table(column1data, column2data, column3data);
T.Properties.RowNames = rows


       column1data column2data column3data
name1       11         44           77
name2       22         55           88
name3       33         66           99

和结构数组

S(1).rownamefield = 'name3';
S(2).rownamefield = 'name1';
S(3).rownamefield = 'name2';
S(1).columnnumberfield = 1;
S(2).columnnumberfield = 3;
S(3).columnnumberfield = 2;
S(1).field3 = [];
S(2).field3 = [];
S(3).field3 = [];

    rownamefield columnnumberfield field3
1     'name3'           1            []
2     'name1'           3            []
3     'name2'           2            []

struct array S包含从表T中选择变量所需的条件。选择变量后,必须将其从表T复制到struct S中的空字段。

S(1).rownamefield包含目标变量所在的表T中的行的名称。 S(1).columnnumberfield包含表T中包含目标变量的列号。因此,S(1).rownamefieldS(1).columnnumberfield实际上是表T中目标变量的坐标。我需要将目标变量从表T复制到struct array中的field3:S(1).field3。这必须对所有结构进行,因此它可能需要在for循环中,但我不确定。

输出应如下所示:

    rownamefield columnnumberfield field3
1     'name3'           1            33
2     'name1'           3            77
3     'name2'           2            55

我不知道如何处理这项任务。当然,这是问题的简化版本。我的真实数据表是200x200,结构数组有超过2000个结构。我将非常感谢任何帮助。

2 个答案:

答案 0 :(得分:2)

您可以执行以下操作。

首先将rownamefieldcolumnnumberfield字段转换为单元格和数组,以用作表格的索引。

rows = {S.rownamefield};
cols = [S.columnnumberfield];
subtable = T(rows, cols);

这为您提供了一个方形表,然后您可以将其转换为单元格并获取您关注的对角元素。

values = table2cell(subtable);
values = values(logical(eye(numel(rows))));

然后,这给出了与S中的条目对应的值的单元格数组。然后我们可以分配它们

[S.field3] = deal(values{:});

disp([S.field3])

    33    77    55

如果table具有与sub2ind等效的内容,则会更容易。

答案 1 :(得分:1)

% Extract table data and linearly index it
tdata   = T{:,:};
[~,row] = ismember({S.rownamefield}, T.Properties.RowNames);
col     = [S.columnnumberfield];
pos     = sub2ind(size(tdata),rowpos, col);
val     = tdata(pos);

% Assign to struct
for ii = 1:numel(S)
    S(ii).field3 =  val(ii);
end

您可以使用Suever的解决方案与deal()一起分配值(首先必须num2cell(val)),而不是for循环。无论什么更快,更直观。