Extracting the first contiguous values without looping
2 views (last 30 days)
Show older comments
Hi everyone,
I need to make a decision based values in a matrix and would like to avoid nested loops. I used arrayfun to produce a matrix of boolean values, but am only interested in the first set of contiguous truths . So, for example, if:
A = [ 1 1 0 0 1 1;
0 0 1 1 1 0;
1 0 1 1 0 0;
0 0 1 1 1 1]
B = [ 1 1 0 0 0 0; % first two bits retained
0 0 1 1 1 0; % unch
1 0 0 0 0 0; % only first bit retained
0 0 1 1 1 1] % unch
The options I've come up with are a bit caddy-whompus and are row-based, so they're no good. These involved (1) casting / strfind or (2) find (first 1 in B, then subsequent 0 in ~B).
Any suggestions?
Regards,
Noel
0 Comments
Accepted Answer
Azzi Abdelmalek
on 24 Mar 2014
Edited: Azzi Abdelmalek
on 24 Mar 2014
A = [ 1 1 0 0 1 1;
0 0 1 1 1 0;
1 0 1 1 0 0;
0 0 1 1 1 1]
B=diff(A,[],2)
[n,m]=size(A);
idx=arrayfun(@(x) min([find(B(x,:)==-1,1)+1 m+1]),1:n)
for k=1:n
A(k,idx(k):end)=0
end
%Or
A = [ 1 1 0 0 1 1;
0 0 1 1 1 0;
1 0 1 1 0 0;
0 0 1 1 1 1]
B=diff(A,[],2)
[n,m]=size(A);
idx=arrayfun(@(x) min([find(B(x,:)==-1,1)+1 m+1]),1:n)
ii=cell2mat(arrayfun(@(x) [idx(x):m;x*ones(1,m-idx(x)+1)],1:n,'un',0))
jj=sub2ind(size(A),ii(2,:),ii(1,:))
A(jj)=0
2 Comments
More Answers (0)
See Also
Categories
Find more on Annotations in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!