MATLAB 匹配 columns/tables
MATLAB matching columns/tables
我有两个 table:
Table 1 有两列,名为 WP_1 和 WP_2。
Table 2 有三个列,分别称为 WP1、WP2 和 WC。
对于 WP_1 和 WP_2 的每一对(行),我想检查它们是否在 WP1 和 WP2 的任何对(行)内。
如果它们在某一对 WP1 和 WP2 中,我想获取该特定对的 WC 的值(0 或 1)并将其打印到 table1 中的新列同一行 --> table1.WC
如果一对 WP_1 和 WP_2 不适合任何一对 WP1 和 WP2 我想在 table1.WC 的特定行中打印值“2”。
这是我希望它看起来像的示例:
what table1.Wc should look like after running the script
解释:
第 1 行中的 WP_1 和 WP_2 是 [0,0] 并且适合第 1 行中的 WP1 和 WP2 [0,145] --> 因此 table 1 中的 WC行等于 table2
中的 WC
第 2 行中的 WP_1 和 WP_2 是 [0,5] 并且适合第 1 行中的 WP1 和 WP2 [0,145] --> 因此 table 中的 WC 1 为此行等于 table2 中的 WC
....
第 4 行中的 WP_1 和 WP_2 是 [115,219] 并且不适合任何行中的任何一对 WP1 和 WP2 --> 因此 table 1 中的 WC该行是 2
WP_1 和第 5 行的 WP_2 是 [219,262] 并且适合第 3 行的 WP1 和 WP2 [169,1693] --> 因此 table 1 中的 WC行等于 table2
中的 WC
到目前为止我的代码:
for n = 1:height(table1)
for m = 1:height(table2)
if table1.WP_1(n) >= table2.WP1(m) &...
table1.WP_2(n) <= table2.WP2(m)
table1.WC(n) = table2.WC(m);
else table1.WC(n) = 2;
end
end
end
这是一个简单的暴力破解方法,它使用 find
获取第一个匹配项的索引,其中行中的值在第二个 table 的范围内。如果 table2.WP2(n) == table2.WP1(n+1) 总是,可以使用一些快捷方式。
% Preallocate the output as not found
table1.WC = ones(length(table1.WP_1),1) * 2;
for i = 1:length(table1.WP_1)
idx = find(and(table1.WP_1(i) >= table2.WP1, table1.WP_2(i) <= table2.WP2), 1, 'first');
if ~isempty(idx)
table1.WC(i) = table2.WC(idx);
end
end
您也可以将 and(...,...)
替换为 &
以使其更短。我喜欢 and
.
的可读性
我有两个 table:
Table 1 有两列,名为 WP_1 和 WP_2。
Table 2 有三个列,分别称为 WP1、WP2 和 WC。
对于 WP_1 和 WP_2 的每一对(行),我想检查它们是否在 WP1 和 WP2 的任何对(行)内。
如果它们在某一对 WP1 和 WP2 中,我想获取该特定对的 WC 的值(0 或 1)并将其打印到 table1 中的新列同一行 --> table1.WC
如果一对 WP_1 和 WP_2 不适合任何一对 WP1 和 WP2 我想在 table1.WC 的特定行中打印值“2”。
这是我希望它看起来像的示例:
what table1.Wc should look like after running the script
解释:
第 1 行中的WP_1 和 WP_2 是 [0,0] 并且适合第 1 行中的 WP1 和 WP2 [0,145] --> 因此 table 1 中的 WC行等于 table2
中的 WC 第 2 行中的WP_1 和 WP_2 是 [0,5] 并且适合第 1 行中的 WP1 和 WP2 [0,145] --> 因此 table 中的 WC 1 为此行等于 table2 中的 WC ....
第 4 行中的WP_1 和 WP_2 是 [115,219] 并且不适合任何行中的任何一对 WP1 和 WP2 --> 因此 table 1 中的 WC该行是 2
WP_1 和第 5 行的 WP_2 是 [219,262] 并且适合第 3 行的 WP1 和 WP2 [169,1693] --> 因此 table 1 中的 WC行等于 table2
中的 WC到目前为止我的代码:
for n = 1:height(table1)
for m = 1:height(table2)
if table1.WP_1(n) >= table2.WP1(m) &...
table1.WP_2(n) <= table2.WP2(m)
table1.WC(n) = table2.WC(m);
else table1.WC(n) = 2;
end
end
end
这是一个简单的暴力破解方法,它使用 find
获取第一个匹配项的索引,其中行中的值在第二个 table 的范围内。如果 table2.WP2(n) == table2.WP1(n+1) 总是,可以使用一些快捷方式。
% Preallocate the output as not found
table1.WC = ones(length(table1.WP_1),1) * 2;
for i = 1:length(table1.WP_1)
idx = find(and(table1.WP_1(i) >= table2.WP1, table1.WP_2(i) <= table2.WP2), 1, 'first');
if ~isempty(idx)
table1.WC(i) = table2.WC(idx);
end
end
您也可以将 and(...,...)
替换为 &
以使其更短。我喜欢 and
.