【问题标题】:MATLAB matching columns/tablesMATLAB 匹配列/表
【发布时间】:2021-08-10 08:01:49
【问题描述】:

我有两张桌子:

表 1 有两列,分别称为 WP_1 和 WP_2。

表 2 有三列,分别称为 WP1、WP2 和 WC。

对于 WP_1 和 WP_2 的每一对(行),我想检查它们是否在 WP1 和 WP2 的任何一对(行)内。

如果它们在某一对 WP1 和 WP2 中,我想取该特定对的 WC 的值(0 或 1)并将其打印到同一行的 table1 中的新列 --> table1。厕所

如果一对 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] --> 因此表 1 中的 WC 等于表 2 中的 WC

第 2 行中的 WP_1 和 WP_2 为 [0,5] 并且适合第 1 行中的 WP1 和 WP2 [0,145] --> 因此表 1 中的 WC 等于表 2 中的 WC ....

第 4 行中的 WP_1 和 WP_2 是 [115,219] 并且不适合任何行中的任何一对 WP1 和 WP2 --> 因此表 1 中该行的 WC 是 2

第 5 行中的 WP_1 和 WP_2 是 [219,262] 并且适合第 3 行中的 WP1 和 WP2 [169,1693] --> 因此表 1 中的 WC 等于表 2 中的 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

【问题讨论】:

  • 您能否更具体地说明您所面临的具体问题?提出问题的方式令人费解且难以理解。您可以创建数据集的简化版本,以代表您正在尝试使用的内容。否则,将很难为您提供帮助。您是否尝试过调试代码并查看变量和索引的状态?
  • 感谢您的评论 - 我更新了我的数据并重组了我的问题。很感谢任何形式的帮助!谢谢!
  • 我仍然觉得编辑后的解释太难理解了。我建议将示例数据更改为玩具问题,使用最简单的数字集仍能说明问题的所有方面。第二组示例与前两个表不对应,我觉得这很混乱。显示你真正想要的清晰的输入输出,以及你需要做的不同的事情来实现它。我也强烈建议在纸上写下你自己的算法来向自己解释;它通常有助于查看摆在您面前的所有步骤。
  • 感谢您的评论 - 我编辑了所有内容,所以现在应该更清楚了。感谢阅读!
  • table2.WP1(1:m) 为您提供了从 1 到 m 的 WP1 的所有列,但您的解释是关于比较行。 table1table2 的长度是否相同?你总是想只比较行吗?如果是这样,您只需要一个循环。如果您想在table2 的所有行中搜索table1 的任何实例,则再次只需要1 个循环。我建议看看ismemberismember(A,B,'rows')

标签: matlab for-loop math matching matlab-coder


【解决方案1】:

这是一个简单的蛮力方法,它使用find 获取第一个匹配项的索引,其中行中的值在第二个表的范围内。如果 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(...,...) 替换为 &amp; 以使其更短。我喜欢and 的可读性。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-31
    • 2012-06-08
    • 1970-01-01
    • 2014-12-14
    • 2015-09-15
    • 1970-01-01
    • 2015-02-12
    相关资源
    最近更新 更多