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

MATLAB: Copying variables from table to struct based on certain criteria

我有一个table

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            []

结构数组 S 包含从 table T 中选取变量所需的条件。选择变量后,必须将其从 table T 复制到结构 S.

中的空字段

S(1).rownamefield 包含 table T 中目标变量所在行的名称。 S(1).columnnumberfield 包含目标变量 table T 中的列数。所以S(1).rownamefield加上S(1).columnnumberfield实际上就是tableT中目标变量的坐标。我需要将目标变量从 table T 复制到结构数组中的 field3:S(1).field3。这必须对所有结构完成,因此它可能需要在 for 循环中,但我不确定。

输出应如下所示:

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

我不知道如何处理这个任务。当然,这是问题的简化版本。我的真实数据 table 是 200x200,结构数组有 2000 多个结构。我将不胜感激任何对此的帮助。

您可以执行以下操作。

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

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

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

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

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

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

disp([S.field3])

    33    77    55

如果 table 有等同于 sub2ind 的东西,这会容易得多。

% 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() 一起使用来代替 for 循环来一次性赋值(必须先 num2cell(val))。什么都更快更直观。