MATLAB爱好者论坛-LabFans.com

MATLAB爱好者论坛-LabFans.com (https://www.labfans.com/bbs/index.php)
-   资料存档 (https://www.labfans.com/bbs/forumdisplay.php?f=72)
-   -   Matlab中两个向量之间的值相互作用 (https://www.labfans.com/bbs/showthread.php?t=26746)

poster 2019-12-14 20:46

Matlab中两个向量之间的值相互作用
 
我有两个等长的向量o和c :

o = [-1 -1 -1 0 0 0 1 1 0 0]; c = [-1 -1 -1 -1 0 1 1 1 0 -1]; o代表打开信号(neg或pos),而c代表关闭信号,假设打开信号之前带有相反的符号。一次只能激活一个信号,因此必须忽略连续性信号。在上面的两个向量中,我的第一个信号将在o(1)而其对应的关闭信号将在c(6) 。这也意味着应该忽略o(2)和o(3)打开信号,并在o(7)找到我的下一个打开信号,并在c(10)处将其相应的关闭,因此导致在o(8)处出现空信号o(8)

我试图找到一种矢量化的解决方案,以识别打开/关闭信号的正确序列或索引,以产生以下解决方案示例的内容:

o = [-1 0 0 0 0 0 1 0 0 0]; c = [ 0 0 0 0 0 1 0 0 0 -1]; 我显然可以通过遍历for循环中的每个元素来解决此问题,但是由于我的数据集最多可以包含数百万个元素,而且我发现Matlab中的循环可能相当“昂贵”,如果有人可以解决我的问题,我将不胜感激那是更面向矩阵的,还是通过arrayfun或类似的东西可以使代码更高效?



[B]回答:[/B]

通常,循环并不比执行其他操作(隐藏在另一个函数(例如arrayfun)后面的循环)更昂贵。从您的文本中听起来,您只是选择了错误的算法。您的问题听起来很线性,即O(n),但是您写的是关于循环的意思是O(n ^ 2)。拥有数百万个元素的二次运行时并不是很好。

您想要的算法是这样的:

open = 0; for i=1:length(o) if (open == 0) open=o(i) else o(i) = 0; end if (c(i) ~= -open) c(i) = 0; else open = 0; end end 如您未详细描述的那样,它可能需要一些优化,例如c和o信号的顺序(例如,如果相同的索引打开和关闭首先是打开处理或关闭,则我的示例代码假定打开),或者是否信号的顺序总是可以的,或者必须进行一些错误处理-但我想您会想到单循环的想法。



[url=https://stackoverflow.com/questions/5473683]更多&回答...[/url]


所有时间均为北京时间。现在的时间是 23:22

Powered by vBulletin
版权所有 ©2000 - 2025,Jelsoft Enterprises Ltd.