Matlab 使用NaN对两列时间填充进行排序/匹配
我有两个包含时间的数组。第一个是设备的状态,指示何时打开电源,第二个数组是向设备发出的实际命令的时间戳。见下图: 垂直虚线表示通电命令,蓝线表示设备状态(1=开0=关) 我想做的是创建一个矩阵,将命令与设备响应匹配起来。问题是他们不是一对一。存在冗余命令和额外的电源循环(来自手动操作等)。理想情况下,我希望将非命令状态更改与命令列中的NaN配对,并且类似地,将任何冗余命令或不会导致状态更改的命令与状态列中的NaN配对。请参见下面的示例数据和所需输出:Matlab 使用NaN对两列时间填充进行排序/匹配,matlab,Matlab,我有两个包含时间的数组。第一个是设备的状态,指示何时打开电源,第二个数组是向设备发出的实际命令的时间戳。见下图: 垂直虚线表示通电命令,蓝线表示设备状态(1=开0=关) 我想做的是创建一个矩阵,将命令与设备响应匹配起来。问题是他们不是一对一。存在冗余命令和额外的电源循环(来自手动操作等)。理想情况下,我希望将非命令状态更改与命令列中的NaN配对,并且类似地,将任何冗余命令或不会导致状态更改的命令与状态列中的NaN配对。请参见下面的示例数据和所需输出: indicatesOn = [1 2 3
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逻辑,认为必须有更好的方法
感谢您的帮助
编辑:我休息了一会儿,跑了几英里,然后又尝试了一次,这是迄今为止我想到的最好的一次
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,:)
如果有人看到任何改进的空间或逻辑漏洞,请告诉我 我可能过于复杂了,但这类似于生物学中的序列比对,我相信基于动态规划的方法可能是理想的。如果你有生物信息学工具箱,你可以使用函数
samplealign
来完成。你可能会看到一个类似的问题:@jonnat我没有访问该工具箱的权限。。。我想当我阅读samplealign
的文档时,我有点脑动脉瘤。你最好将你的代码作为答案发布,然后从问题中删除。@yuk我不确定回答你自己的问题是否完全正确,因为回答你自己的问题时会弹出警告。然而,我按照你的建议移动了它。
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