逻辑数的条件操作
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
请给我以下时间序列 { 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