Use array values as assignment indecis
2 views (last 30 days)
Show older comments
Gabriel Stanley
on 23 Nov 2022
Commented: Gabriel Stanley
on 23 Nov 2022
A = N-by-2 array, wherein A(:,1)<A(:,2)
B = M-by-2 array, wherein B(:,1)<B(:,2)
A and B are essentially time stamps.
C = unique(vertcat(A,B));
[~,D] = ismember(A,C);
[~,E] = ismember(B,C);
C([D(1,1):D(1,2),...D(N,1):D(N,2)],2) = any scalar, or an array with a sufficient number of elements to dstribute.
C([E(1,1):E(1,2),...E(N,1):E(N,2)],3) = any scalar, or an array with a sufficient number of elements to dstribute.
I'm hung up on defining those assignment indecis [D(1,1):D(1,2),...D(N,1):D(N,2)] without using a loop, i.e.
IdcsD = double.empty;
for i=1:size(D,1)
Idcs = [Idcs,[D(i,1):D(i,2)]];
end
C(IdcsD) = Value;
3 Comments
Accepted Answer
Matt J
on 23 Nov 2022
Edited: Matt J
on 23 Nov 2022
The question has nothing to do really with ismember. It's more about how to turn a list of interval end points into indices. One way is as follows:
D=[1 5 9;
2 7 12]' %interval end points
C=rand(1,12);
nc=length(C);
assert(all(diff(D,1,2)>=0) & all(D(:)>0) & all(D(:)<=nc) ,'Invalid data present')
D=D+[0,1]; s=0*D+[1,-1];
csum=cumsum( accumarray(D(:),s(:),[nc+1,1]) );
Idcs=logical(csum(1:end-1))',
Idcs=find(Idcs) %Shouldn't be needed. Use logical indices above.
More Answers (0)
See Also
Categories
Find more on Loops and Conditional Statements 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!