【问题标题】:Link two tables based on conditions in matlab根据matlab中的条件链接两个表
【发布时间】:2015-08-29 10:45:48
【问题描述】:

我正在使用 matlab 准备我的数据集,以便在某些数据挖掘模型中运行它,并且我面临着在我的两个表之间链接数据的问题。

所以,我有两个表 A 和 B,其中包含特定时间戳中某些值的顺序记录,我想创建第三个表 C,我将在其中添加 A 和 B 的列根据某些条件行。

表 A 和 B 的行数不同(A 有更多测量值),但它们都有两列:

  • 第 1 列:记录时间 (hh:mm:ss) 和
  • 第二列:当时记录的值

当满足以下所有条件时,将在表C中添加A和B的列:

  1. A和B的时间差大于3秒小于5秒

  2. A的记录值是B记录值的40% - 50%。

任何帮助将不胜感激。

【问题讨论】:

  • 欢迎来到 SO。您能否使用您已经尝试过的代码添加minimal reproducible example,列出您遇到的任何错误并解释为什么此代码不起作用以及您希望它做什么。

标签: arrays matlab if-statement for-loop


【解决方案1】:

对于第一个条件,您需要[row,col,val]=find((A(:,1)-B(:,1))>2sec && (A(:,1)-B(:,1))<5sec) 之类的东西,您确实需要使用datenum 或等效的东西来转换您的时间戳。对于第二个条件,这同样适用,请使用 [row,col,val]=find(A(:,2)>0.4*B(:,2) && A(:,2)<0.5*B(:,2)

datenum 允许你转换你的数组,所以首先这样做:

A(:,1) = datenum(A(:,1));
B(:,1) = datenum(B(:,1));

您可能需要检查datenum 上的documentation,了解您的字符串的格式。

time1 = [datenum([0 0 0 0 0 3]) datenum([0 0 0 0 0 3])];

创建 3 和 5 秒的日期数字。全部合并:

A(:,1) = datenum(A(:,1));
B(:,1) = datenum(B(:,1));
time1 = [datenum([0 0 0 0 0 3]) datenum([0 0 0 0 0 3])];
[row1,col1,val1]=find((A(:,1)-B(:,1))>time1(1)&& (A(:,1)-B(:,1))<time1(2));
[row2,col2,val2]=find(A(:,2)>0.4*B(:,2) && A(:,2)<0.5*B(:,2);

rowcol 的变量在您只需要值时可能不需要。 val1 包含条件 1 的值,条件 2 的 val2。如果您希望两个条件同时有效,请在 find 命令中同时使用:

[row3,col3,val3]=find((A(:,1)-B(:,1))>time1(1)&& ...
(A(:,1)-B(:,1))<time1(2) && A(:,2)>0.4*B(:,2)...
 && A(:,2)<0.5*B(:,2);

根据条件实际添加两个数组:

C = A(row3,2)+B(row3,2);

【讨论】:

    【解决方案2】:

    感谢您的回复和帮助!然而,当时我采用了一种不同的方法,将hh:mm:ss 转换为秒,这将使以后的比较更容易:

    dv1 = datevec(A, 'dd.mm.yyyy HH:MM:SS.FFF ');
    secs = [3600,60,1];
    dv1(:,6) = floor(dv1(:,6));
    timestamp = dv1(:,4:6)*secs.';
    

    现在我正在将时间和重量条件结合到一段将运行的代码中。我应该在for 循环中使用if 条件还是不需要for 循环?

    【讨论】:

      猜你喜欢
      • 2016-11-18
      • 2021-11-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-23
      • 1970-01-01
      相关资源
      最近更新 更多