假设我们有这两种类型的日期:
type_1 = {'23.2.2005', '23.4.2015', '5.1.2015'};
type_2 = {'23.02.2005', '23.04.2015', '05.01.2015'};
当我们使用这个函数比较这两种类型时:
ismember(type_1,type_2)
这两种类型中没有任何相等(因为在type2
中加零)。我们如何正确比较这两种类型?
答案 0 :(得分:6)
另一种方法是使用datestr
和datenum
来强制转换额外的零。
type_1 = datestr(datenum(type_1, 'dd.mm.yyyy'), 'dd.mm.yyyy');
type_2 = datestr(datenum(type_2, 'dd.mm.yyyy'), 'dd.mm.yyyy');
datestr
需要MATLAB日期编号才能输出日期的字符串表示。这就是使用datenum
的原因,您可以看到,即使我们为月份或日期指定了两位数字,但如果这些数量有一个数字并且日期编号已成功转换。然后,我们会使用这些日期数字输入datestr
,以确保在需要时我们有额外的零。
但是,这会将单元格数组转换为字符数组。您必须使用cellstr
:
type_1 = cellstr(type_1);
type_2 = cellstr(type_2);
这里有一些示例输出:
>> type_1 = {'23.2.2005', '23.4.2015', '5.1.2015'}
type_1 =
'23.2.2005' '23.4.2015' '5.1.2015'
>> type_2 = {'23.02.2005', '23.04.2015', '05.01.2015'}
type_2 =
'23.02.2005' '23.04.2015' '05.01.2015'
>> type_1 = datestr(datenum(type_1, 'dd.mm.yyyy'), 'dd.mm.yyyy')
type_1 =
23.02.2005
23.04.2015
05.01.2015
>> type_2 = datestr(datenum(type_2, 'dd.mm.yyyy'), 'dd.mm.yyyy')
type_2 =
23.02.2005
23.04.2015
05.01.2015
>> type_1 = cellstr(type_1)
type_1 =
'23.02.2005'
'23.04.2015'
'05.01.2015'
>> type_2 = cellstr(type_2)
type_2 =
'23.02.2005'
'23.04.2015'
'05.01.2015'
>> ismember(type_1, type_2)
ans =
1
1
1
答案 1 :(得分:5)
这可以避免使用regexp
,使用数字转换技巧:
del0str = @(x) sprintf('%d.%d.%d',sscanf(x,'%d.%d.%d'));
del0cell = @(x) cellfun(del0str, x, 'UniformOutput', false);
[ix1, ix2] = ismember(del0cell(type_1), del0cell(type_2));
请注意,无论日期中的订单或日/月/年,只要订单在两个单元格数组之间保持一致,此操作就会起作用。
答案 2 :(得分:3)
“现代”(R2014b +)的方式是使用MATLAB的datetime
类,如下所示:
>> dt1 = datetime(type_1, 'InputFormat', 'dd.MM.yyyy')
dt1 =
23-Feb-2005 23-Apr-2015 05-Jan-2015
>> dt2 = datetime(type_2, 'InputFormat', 'dd.MM.yyyy')
dt2 =
23-Feb-2005 23-Apr-2015 05-Jan-2015
>> ismember(dt1, dt2)
ans =
1 1 1