如何确保在MATLAB中完全包含日期数字向量

时间:2015-04-18 19:20:56

标签: matlab date vector

我有两个包含日期编号的向量AB。理论上,B中的所有系数也应包含在A中。不幸的是,这种情况并非如此。我的理论证明用A向量中的下一个日期编号替换所有不对应的日期编号,我想编写一个脚本。

更具体地说:两个向量都包含金融交易的日期。向量A包含所检查时间段的所有交易日,因此B中的所有交易日期也应包含在A中,因为交易不能在非交易日进行。 B中的条目不在A的情况下我假设交易被错误地报告在非交易日发生,因此我希望用下一个最高的数字替换这些日期。包含在A

举一个例子,我想转此:

A = [2;3;4;7]
B = [2;3;4;5;6;7]

进入这个:

A = [2;3;4;7]
B = [2;3;4;7;7;7]

因为B(4:5)未包含A,所以5被修改了。该脚本必须标识A中未包含5+i,然后检查A中是否包含7,直到此评估结果为真(这种情况就是这样)在B)。此时系数将插入A以替换旧日期。

请注意,此问题与this earlier question密切相关;但是,这个问题并不是确定工作日。相反,我想接受我的一个日期向量(A)作为权威(即充分代表交易日,包括国家法定假日),并以{{1}}向量上的不符合条目的替换为基础而不是彭博功能。

2 个答案:

答案 0 :(得分:2)

此解决方案假定ab已经排序。如果没有,则只需将其替换为sort(a)sort(b)

a = [ 2; 3; 4; 7 ];
b = [ 2; 3; 4; 5; 6; 7 ];

% Check each element in b
for k = 1: length(b)

    % If this element of b is not contained in a
    if (all(a(:) ~= b(k)))

        % Replace with the next element in a that is greater than b(k)
        b(k) = a(find(a(:) > b(k), 1, 'first'));
    end
end

答案 1 :(得分:1)

您可以应用bsxfunA的每个元素与B的每个元素进行比较,然后使用max的第二个输出来查找所需的索引:< / p>

[~, ind] = max(bsxfun(@le, B(:).', A(:)), [], 1);
B_result = A(ind);

这假设对于B的每个元素,A中至少有一个元素大于或等于。值不必是整数或排序。例如,

A = [2; 3.5; 4.5; 7; 10];
B = [0.1; 2; 2; 6; 5; 4.5];

给出

B_result =
    2.0000
    2.0000
    2.0000
    7.0000
    7.0000
    4.5000