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 多个结构。我将不胜感激任何对此的帮助。
您可以执行以下操作。
首先将 rownamefield
和 columnnumberfield
字段转换为单元格和数组,用作 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)
)。什么都更快更直观。
我有一个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 多个结构。我将不胜感激任何对此的帮助。
您可以执行以下操作。
首先将 rownamefield
和 columnnumberfield
字段转换为单元格和数组,用作 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)
)。什么都更快更直观。