Turning 1s to 0s in a logical vector when element distance between 1s is below threshold
1 view (last 30 days)
Show older comments
Hello,
I have a logical vector of 1.5 million elements. I need to look through the elements in the vector, and whenever I find a 1, I need to turn any potential subsequent 1s in the next N elements into 0s. While this would be easy to implement with a for loop, I'm struggling to figure out a more efficient way to do it.
Example:
If [ 1 1 0 0 0 0 1 0 1 0 0 0 1 ] is my vector, and my N threshold is 5, I want to turn that vector into [ 1 0 0 0 0 0 1 0 0 0 0 0 1 ].
Thank you in advance.
Accepted Answer
Jonas
on 4 Aug 2021
you can try the follwing, but i don't know if it is faster
H = [ 1 1 0 0 0 0 1 0 1 0 0 0 1 ]; eraseNAfter=5; Hstr=num2str(H); out=regexprep(Hstr,['1' repmat('.',[1 3*eraseNAfter])],['1' repmat(' 0',[1 eraseNAfter])]); asDouble=str2mat(out)
i am also sure the regexp could be written nicer
2 Comments
Jonas
on 4 Aug 2021
that's true, fast solition would be padding the array and removing the padded elements at the end
H = [ 1 1 0 0 0 0 1 0 1 0 0 0 1 1]; eraseNAfter=5; H=[H repmat(0,[1 eraseNAfter])]; Hstr=num2str(H); out=regexprep(Hstr,['1' repmat('.',[1 3*eraseNAfter])],['1' repmat(' 0',[1 eraseNAfter])]); asDouble=str2mat(out); asDouble((end-eraseNAfter+1):end)=[]
More Answers (0)
See Also
Categories
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!