我有一张桌子
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).rownamefield
加S(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个结构。我将非常感谢任何帮助。
答案 0 :(得分:2)
您可以执行以下操作。
首先将rownamefield
和columnnumberfield
字段转换为单元格和数组,以用作表格的索引。
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循环。无论什么更快,更直观。