我有两个向量,它们包含"开始"和"结束"位置(作为逻辑),我希望将它们组合起来创建第三个向量,Final:
Starts = [0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0];
Ends = [0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0];
Run Code Online (Sandbox Code Playgroud)
最终矢量看起来像这样:
Final = [0 0 0 1 1 1 1 1 0 0 1 1 1 1 1 1 1 1 1 0];
Run Code Online (Sandbox Code Playgroud)
目前,我可以使用for循环完成此操作,如下所示:
Start_Locations = find(Starts);
End_Locations = find(Ends);
Final = zeros(20,1);
for x=1:length(Start_Locations)
Final(Start_Locations(x):End_Locations(x),1) = 1;
end
Run Code Online (Sandbox Code Playgroud)
我想知道是否有办法在没有for循环的情况下完成同样的事情.例如,我可以使用以下"硬编码"语句完成上面概述的内容:
Final([4:8,11:19],1) = 1;
Run Code Online (Sandbox Code Playgroud)
具体来说,有没有办法以一种方式组合Start_Locations和End_Locations向量,以便我可以有一个单一的语句,如:
Final(Combined_Start_and_End_Locations,1) = 1;
Run Code Online (Sandbox Code Playgroud)
完成我for上面的循环所做的事情?我正在努力学习for尽可能多地避免循环,并且非常感谢任何创建上述Final向量的解决方案,而不需要求助于循环.
这样的问题可以经常使用既可以解决diff或cumsum.它们本质上是离散的导数和积分函数.
对于你的问题我相信
Final = cumsum([Starts 0]-[0 Ends]);
Final = Final(1:end-1);
Run Code Online (Sandbox Code Playgroud)
达到了预期的效果.