根据matlab中的条件链接两个表

时间:2015-08-29 10:45:49

标签: arrays matlab if-statement for-loop

我正在使用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%。

  3. 非常感谢任何帮助。

2 个答案:

答案 0 :(得分:0)

对于第一个条件,您需要[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的条件1,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);

答案 1 :(得分:0)

感谢您的回复和帮助!然而,有时我通过将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.';

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