Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matlab 使用NaN对两列时间填充进行排序/匹配_Matlab - Fatal编程技术网

Matlab 使用NaN对两列时间填充进行排序/匹配

Matlab 使用NaN对两列时间填充进行排序/匹配,matlab,Matlab,我有两个包含时间的数组。第一个是设备的状态,指示何时打开电源,第二个数组是向设备发出的实际命令的时间戳。见下图: 垂直虚线表示通电命令,蓝线表示设备状态(1=开0=关) 我想做的是创建一个矩阵,将命令与设备响应匹配起来。问题是他们不是一对一。存在冗余命令和额外的电源循环(来自手动操作等)。理想情况下,我希望将非命令状态更改与命令列中的NaN配对,并且类似地,将任何冗余命令或不会导致状态更改的命令与状态列中的NaN配对。请参见下面的示例数据和所需输出: indicatesOn = [1 2 3

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

垂直虚线表示通电命令,蓝线表示设备状态(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逻辑,认为必须有更好的方法

感谢您的帮助


编辑:

我休息了一会儿,跑了几英里,然后又尝试了一次,这是迄今为止我想到的最好的一次

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