我正在尝试在给定数组中组合连续相似的位。例如:
输入:
a=[0 0 0 1 1 1 0 0 1 0];
输出:
b=[0 1 0 1 0];
我的输入数组大小超过100000,所以显然我不想遍历整个输入数组。有没有更简单的方法?也许一个递归的划分和规则算法? 仅供参考,我在MATLAB中运行它,因此任何使用矩阵运算的方法都很棒
答案 0 :(得分:1)
循环遍历整个阵列(至少在最坏的情况下),你做得不够好。
这个解决方案当然是微不足道的 - 你只需循环遍历 - 如果当前元素与最后一个元素不同,则将其添加到输出中。
你可以稍微做一些 ,而不仅仅是通过一些额外的复杂性来循环。
考虑一下我们遇到的情况:
...0x1... or ...1x0...
其中x
是0
或1
。无论x
是什么,输出仍然是相同的。
所以,我们能做的就是检查每一个元素。如果该元素与元素2的位置不同,我们可以简单地将其添加到输出并继续。如果它是相同的,我们需要检查前一个元素(如果前一个元素不同,将前一个元素和当前元素都添加到输出中,如果它们相同,则继续)。
请注意,循环100000个元素不会花费特别长的时间。
答案 1 :(得分:1)
对于提供的示例,这将起作用:
a(abs(diff(a)) ~= 1) = []
a =
0 1 0 1 0
但是,不确定它如何概括为a
的其他示例。
答案 2 :(得分:1)
以下类似于@ Marcin的答案,但它会对幸存的条目编制索引,而不是删除重复的条目:
a = a([true logical(diff(a))]);
在我的电脑上,对于长度为100000的矢量,速度大约是其两倍。