【问题标题】:Sort / Match two columns of times padding with NaN排序/匹配两列时间填充 NaN
【发布时间】:2012-02-16 02:42:30
【问题描述】:

我有两个包含时间的数组。第一个是指示何时打开电源的设备状态,第二个数组是发出给设备的​​实际命令的时间戳。见下图:

垂直虚线表示开机命令,蓝线表示设备状态(1=开启 0=关闭)。

我想要做的是创建一个矩阵来匹配设备响应的命令。问题是它们不是一对一的。有冗余命令和额外的电源循环(来自手动操作等)。理想情况下,我想将非命令状态更改与命令列中的 NaN 配对,类似地,任何冗余命令或不会导致状态更改为状态列中的 NaN 的命令。请参阅下面的示例数据和所需的输出:

indicatesOn = [1 2 3 4 5];
commandIssue = [1.9 2.8 2.9 4.8 4.9 5.1]

matchedOutput =

       NaN    1.0000
    1.9000    2.0000
    2.8000       NaN
    2.9000    3.0000
       NaN    4.0000
    4.8000       NaN
    4.9000    5.0000
    5.1000       NaN

所以基本上命令时间在第 1 列,开机在第 2 列。命令列中的 NaN 表示没有先前的命令来改变状态(设备的手动操作)。 State/power-on 列中的 NaN 表示设备未响应该特定命令(已启动或已发出多个命令)。

我开始尝试解决这个问题,结果陷入了一堆 for 循环和大量 if/else 逻辑,并认为必须有更好的方法。

感谢任何帮助!

编辑:

【问题讨论】:

  • 我可能过于复杂了,但这类似于生物学中的序列比对,我相信基于动态编程的方法可能是理想的。如果你有生物信息学工具箱,你可以使用函数samplealign来做。
  • 您可能会看到一个类似(但肯定不一样)的问题:stackoverflow.com/questions/2142826/…
  • @jonnat 我无权使用那个工具箱......而且我认为当我阅读samplealign 的文档时我有轻微的脑动脉瘤。
  • 您最好将代码作为答案发布并从问题中删除。
  • @yuk 我不太确定回答你自己的问题是否完全是无稽之谈,因为回答你自己的问题时会弹出警告。但是,我按照您的建议移动了它。

标签: matlab


【解决方案1】:

我休息了一下,跑了几英里,然后又试了一次,这是迄今为止我想出的最好的。

indicatesOn = [1 2 3 4 5];
cmdIssue = [1.9 2.8 2.9 4.8 4.9 5.1];

cmdIndex = arrayfun(@(x) find(cmdIssue < x,1,'last'),indicatesOn,'uniformoutput',false);
outState = indicatesOn(:);
outCmd = nan(size(outState));
usedCmds = false(size(cmdIssue(:)));
for k =1:numel(cmdIndex)
    if ~isempty(cmdIndex{k})        
        outCmd(k,1) = cmdIssue(cmdIndex{k});
        usedCmds(cmdIndex{k}) = true;
    end
end

%Fix duplicate Commands (replace with NaN)
outCmd(diff(outCmd)==0) = NaN; 
remCmds = cmdIssue(~usedCmds);
outCmd = [outCmd;remCmds(:)];  %Append remaining unprocessed Cmds
outState = [outState;nan(numel(remCmds),1)]; %Add NaNs to state.

%Sort the output by the min time stamp row-wise
matchedOutput = [outCmd outState];
[temp sortI] = sort(min(matchedOutput,[],2));
matchedOutput = matchedOutput(sortI,:)

导致:

matchedOutput =

       NaN    1.0000
    1.9000    2.0000
    2.8000       NaN
    2.9000    4.0000
       NaN    3.0000
    4.8000       NaN
    4.9000    5.0000
    5.1000       NaN

如果有人发现任何改进空间或逻辑漏洞,请告诉我。

【讨论】:

    猜你喜欢
    • 2021-08-11
    • 2021-01-07
    • 2019-05-18
    • 1970-01-01
    • 2022-01-15
    • 2021-10-23
    • 2019-05-10
    • 2018-09-06
    • 1970-01-01
    相关资源
    最近更新 更多