在cellfun函数的输出中混淆

时间:2013-09-05 15:22:29

标签: matlab

我想找出经过的时间,在函数文件中我编写了这段代码;

function elapsed = elapsedTime(d1,d2)
%Input d1 = '2010/12/04 12:00:00'
%Input d2 = '2010/12/14 13:06:36'
d1r = regexp(d1,'((/|:)?|[ ])?','split');
d2r = regexp(d2,'((/|:)?|[ ])?','split');
elapsed = cellfun(@minus,d1r,d2r,'UniformOutput',false);
end

输出如下:

ans = 
    [1x4 double]    [1x2 double]    [1x2 double]    [1x2 double]    [1x2 double]    [1x2 double]

此输出格式不合适,因为我无法使用它来查找已用时间!

如果不提供如下所示的单元格数组,如何使用它将其映射到实际输出:

ans = '0000' '00' '00' '01' '06' '36'

有没有办法纠正这个?

2 个答案:

答案 0 :(得分:1)

您正在减去字符串,并期望得到这些数字(以字符串的形式)。

如果你这样做,你会发生什么:

>> '3' - '10'

?如果你说答案应该是'-7',那么

怎么样?
>> 'a' - 'B'

最易于理解的解决方案是将字符串转换为数字,执行减法,然后转换回字符串:

elapsed = cellfun(@(x,y) ...
    num2str(str2double(y)-str2double(x)), ...
    d1r, d2r, 'UniformOutput', false);

答案 1 :(得分:1)

如果你正在使用日期/时间戳,你应该考虑使用datenumdatestr而不是重新发明日期解析轮:

function elapsed = elapsedTime(d1,d2)
%Input d1 = '2010/12/04 12:00:00'
%Input d2 = '2010/12/14 13:06:36'
fmt = 'yyyy/mm/dd HH:MM:SS';

elapsed = diff(datevec( [d1;d2], fmt ),1,1)
end

这将返回:

elapsed =

     0     0    10     1     6    36

这里的另一个好处是,您可以非常轻松地适应日期格式的变化。您可能还想查看etimedatevec函数。