0

这是一个不太难的问题,但是因为我还在学习 MATLAB,我不得不佩服我有点挣扎。好吧,假设我们有两个数据集:

Input1 = [
Date;X1;X2;X3
2007-06-19;2;1;3
2007-06-22;1;2;3
2007-06-01;1;2;3
2007-06-18;1;2;3
2007-06-19;1;2;3
2007-06-20;1;2;3
2007-06-25;1;2;3
]

Input2 = [
Date;X1;X2;X3
2007-06-22;1;2;3
2007-06-19;1;2;3
2007-06-25;2;1;3
2007-06-01;1;2;3
2007-06-15;1;2;3
2007-06-18;1;2;3
2007-06-21;1;2;3
2007-06-25;1;2;3
]

Output1 = [
]

Output2 = [
]

我想要做的是: - 根据第一列(最旧的日期放在第一位)分别对它们中的每一个进行排序。- 根据第一列分别删除每个文件中的重复项。- 当且仅当它们的键在这两个数据集中都存在时,保留两行(每个数据集一个)。- 做最后检查以确保两个列表上的日期元素一一相同。

尤林。

4

3 回答 3

3

为了让您开始,您需要稍微清理一下您的输入数据,然后才能真正释放 Matlab 的强大功能。

首先,丢失“列标题”,Date;X1;X2;X3。Matlab 数组是数字的,甚至 Matlab 字符数组也是真正的数字。

其次,仅在每行末尾放置分号;就 Matlab 数组而言,分号是一行的结尾,因此您的表有可能成为列向量。在您当前有分号的地方使用空格或逗号,并在每行的末尾放置一个分号。

第三,Matlab 数组是数字的,类似 2007-06-22 的东西不是数字。正如您所写的那样,Matlab 也不会将其识别为字符串。如果它确实将它识别为一个字符串,它会在输入中呕吐,因为它不全是数字。

您可以使用元胞数组或结构,但将输入数组转换为数字可能更容易。例如,计算以下表达式:

Input1 = [
datenum(datevec('2007-06-19')),2,1,3;
datenum(datevec('2007-06-22')),1,2,3;
datenum(datevec('2007-06-01')),1,2,3;
datenum(datevec('2007-06-18')),1,2,3;
datenum(datevec('2007-06-19')),1,2,3;
datenum(datevec('2007-06-20')),1,2,3;
datenum(datevec('2007-06-25')),1,2,3;
]

正如 Dan 已经建议的那样,将为您提供一个不错的数字数组。 datenum并且datevec是 Matlab 内置的函数。

于 2012-06-18T14:50:00.107 回答
2

为了让您开始,一个没有重复的排序列表为每个列表执行此操作:

% find the unique values for the first column
[~, I] = unique(Input1(:,1));
% extract the records for each unique value in the first column (sorted)
SortedAndUnique = Input1(I,:);

我相信你会解决剩下的

于 2012-06-18T14:30:53.710 回答
1

一些提示:

  • 你可以用datenum('2007-06-22','yyyy-mm-dd')数字来表达你的日期
  • unique()正如丹的回答中提到的那样
  • intersect()查找 Input1 和 Input2 中的键
于 2012-06-18T14:54:15.040 回答