Labfans是一个针对大学生、工程师和科研工作者的技术社区。 论坛首页 | 联系我们(Contact Us)
MATLAB爱好者论坛-LabFans.com
返回   MATLAB爱好者论坛-LabFans.com > 其它 > 资料存档
资料存档 资料存档
回复
 
主题工具 显示模式
旧 2019-12-14, 20:46   #1
poster
高级会员
 
注册日期: 2019-11-21
帖子: 3,006
声望力: 66
poster 正向着好的方向发展
帖子 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或类似的东西可以使代码更高效?



回答:

通常,循环并不比执行其他操作(隐藏在另一个函数(例如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信号的顺序(例如,如果相同的索引打开和关闭首先是打开处理或关闭,则我的示例代码假定打开),或者是否信号的顺序总是可以的,或者必须进行一些错误处理-但我想您会想到单循环的想法。



更多&回答...
poster 当前离线   回复时引用此帖
回复

主题工具
显示模式

发帖规则
不可以发表新主题
不可以发表回复
不可以上传附件
不可以编辑自己的帖子

启用 BB 代码
论坛禁用 表情符号
论坛启用 [IMG] 代码
论坛启用 HTML 代码



所有时间均为北京时间。现在的时间是 03:25


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