1

我有一张桌子

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 数组S包含从 table 中选择变量所需的条件T。选择变量后,必须将其从 table 复制T到 struct 中的空字段S

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

输出应如下所示:

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

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

4

2 回答 2

2

您可以执行以下操作。

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

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.

于 2016-02-06T14:22:03.090 回答
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

Instead of the for-loop, you can use Suever's solution with the deal() to assign values in one go (have to num2cell(val) first). Whatever is faster and more intuitive.

于 2016-02-06T14:25:39.770 回答