MATLAB Answers

0

Converting elements which repeat more than 10 times to 0

Mate 2u さんによって質問されました 2013 年 7 月 4 日
Hi there, I have an array (4048x1) full of 1s and -1s. I want change it so that, if there are more than 10 consecutive 1s or 10 consecutive -1s, then the rest of the consecutive elements after the 10 will become 0 (zeros).
Ie, if we have 1 -1 1 1 -1 -1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 -1 1
we would want 1 -1 1 1 -1 -1 1 1 1 1 1 1 1 1 1 1 0 0 -1 1 -1 1
Thanks

  1 件のコメント

i think u can use sum command for 10 ones... if sum==10 then '0' should be placed.

サインイン to comment.

タグ

2 件の回答

Ken Atwell
回答者: Ken Atwell
2013 年 7 月 4 日
 採用された回答

I would love to see a vectorized way to do this, but using a loop:
x=[1 -1 1 1 -1 -1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 -1 1];
zeroX = false(size(x));
for i =11:numel(x)
xsum = sum(x(i-10:i));
if xsum>10 || xsum <-10
zeroX(i) = true;
end
end
x(zeroX) = 0

  1 件のコメント

Mate 2u 2013 年 7 月 4 日
Thanks, very good!

サインイン to comment.


Tom
回答者: Tom
2013 年 7 月 4 日

A = [1 -1 1 1 -1 -1 1 1 1 1 1 1 1 1 1 1 1 1 -1 1 -1 1];
Correct = [1 -1 1 1 -1 -1 1 1 1 1 1 1 1 1 1 1 0 0 -1 1 -1 1];
D = [0 diff(A)]/2; %find split points
C = cumsum(abs(D))+1; %create accumarray subs
M = accumarray(C',A,[], @(x) {x'.*(1:length(x) <= 10)}); %split each section into a cell array and set > 10 to 0
B = [M{:}]; %merge
isequal(Correct,B)

  1 件のコメント

Ken Atwell
2013 年 7 月 5 日
Ah, the magic of accumarray, thanks for sharing.
In this case, the loop is probably the "better choice", as it runs in under half the time and would use far less memory (no cell arrays)

サインイン to comment.



Translated by