逻辑数的条件操作

Conditional manipulation of logical numbers

请给我以下时间序列 { 111110011111000000011000011111},时间间隔为秒。我想在序列上使用以下条件。
假设逻辑 (1) = True 和 (0) = false

如果 false 发生时间 < 3 秒并且在两个“true”之间,那么它被翻译为 1

例如11111001111 因为 false 出现次数少于 3 次且介于 ones 之间 零被转换为 1。答案是 11111111111

如果 true 小于 3 秒,它们将被转换为 0。 例如,如果 0000001100000,因为出现的次数少于 3 次,那么答案变为 0000000000000

应用条件时第一个例子的答案是

11111111111100000000000011111

如果有人帮助我编写这段代码,我将不胜感激 MATLAB 提前致谢

X = [1,1,1,1,1,0,0,1,1,1,1,1,0,0,0,0,0,0,0,1,1,0,0,0,0,1,1,1,1,1];  % Work with this array.
target = 3;
ind = find(X < target);
disp(ind);
logInd = X < target;

这是实现 (1.00 * EDGES + 0.99 * FP + 0.98 * FN) 最小化的代码,其中 FN 表示假 low/negative,FP 表示假 high/positive。

该实现使用维特比解码器方法,该方法最初设计用于在嘈杂的信道中对卷积码进行最佳解码。卷积编码被惩罚每个 0->1 和 1->0 转换所取代。

我已经根据应用程序命名了一些变量,以通过嘈杂的方式接收消息 link。 rxmsg 是处理发生之前,decode 是处理的结果。

function [best, trellis] = optimize(rules, rxmsg)
    endpoints = repmat(struct('decode', [], 'cost', 0), 2, 1);
    trellis = repmat(endpoints, 1, numel(rxmsg));
    for i = 1:numel(rxmsg)
        % find lowest cost path ending in low (0)
        if endpoints(1).cost < endpoints(2).cost + rules.edgecost
            from = endpoints(1);
            transition = 0;
        else
            from = endpoints(2);
            transition = rules.edgecost;
        end
        lowcost = rules.falsepositivecost * (1 == rxmsg(i));
        next(1) = struct('decode', [from.decode, 0], 'cost', from.cost + transition + lowcost);
        
        % find lowest cost path ending in high (1)
        if endpoints(1).cost + rules.edgecost < endpoints(2).cost
            from = endpoints(1);
            transition = rules.edgecost;
        else
            from = endpoints(2);
            transition = 0;
        end
        highcost = rules.falsenegativecost * (0 == rxmsg(i));
        next(2) = struct('decode', [from.decode, 1], 'cost', from.cost + transition + highcost);
        
        % prepare for next step
        endpoints = next;
        trellis(:, i) = next;
    end
    
    if endpoints(1).cost < endpoints(2).cost
        best = endpoints(1);
    else
        best = endpoints(2);
    end
    best.rxmsg = rxmsg;
end

用法示例:

>> rules = struct('edgecost', 1.00, 'falsenegativecost', 0.98, 'falsepositivecost', 0.99);
>> [best, trellis] = optimize(rules, [1,1,1,1,1,0,0,1,1,1,1,1,0,0,0,0,0,0,0,1,1,0,0,0,0,1,1,1,1,1])

best = 

    decode: [1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1]
      cost: 5.9400
     rxmsg: [1 1 1 1 1 0 0 1 1 1 1 1 0 0 0 0 0 0 0 1 1 0 0 0 0 1 1 1 1 1]


trellis = 

2x30 struct array with fields:

    decode
    cost

我还制作了一个可视化工具来查看更改了哪些位

function display_message_and_decode(rxmsg, decodemsg)
    same = struct('t', [], 'y', []);
    rejected = same;
    corrected = same;
    
    agreemask = (rxmsg == decodemsg);
    for i = 1:numel(agreemask)
        if i > 1
            if agreemask(i-1) && agreemask(i)
                same.t = [same.t, NaN, i-1, i-.9];
                same.y = [same.y, NaN, rxmsg(i-1), rxmsg(i)];
            else
                rejected.t = [rejected.t, NaN, i-1, i-.9];
                rejected.y = [rejected.y, NaN, rxmsg(i-1), rxmsg(i)];
                corrected.t = [corrected.t, NaN, i-1, i-.9];
                corrected.y = [corrected.y, NaN, decodemsg(i-1), decodemsg(i)];
            end
        end
        
        if agreemask(i)
            same.t = [same.t, NaN, i-.9, i];
            same.y = [same.y, NaN, rxmsg(i), rxmsg(i)];
        else
            rejected.t = [rejected.t, NaN, i-.9, i];
            rejected.y = [rejected.y, NaN, rxmsg(i), rxmsg(i)];
            corrected.t = [corrected.t, NaN, i-.9, i];
            corrected.y = [corrected.y, NaN, decodemsg(i), decodemsg(i)];
        end
    end
    
    handles = plot(same.t, same.y, 'k-', rejected.t, rejected.y, 'r-', corrected.t, corrected.y, 'g-', 'LineWidth', 1);
    set(handles(1), 'LineWidth', 4);
    set(gca, 'YLim', [-.2 1.2]);
end

以下是评论中讨论的一些测试用例的结果:

  • 请注意,最后三个生成的结果与您的澄清评论所建议的不同。这是一个函数,可以计算您认为更好结果的任何建议解决方案的成本:

    function result = score(rules, rxmsg, decodemsg)
        result = rules.edgecost * sum(abs(diff(decodemsg))) ...
            + rules.falsenegativecost * sum(decodemsg & ~rxmsg) ...
            + rules.falsepositivecost * sum(rxmsg & ~decodemsg);
    end