Avoiding for loop with ismember
2 views (last 30 days)
Show older comments
Hi, suppose N is a scalar, and c is a numerical vector with unique elements that are a subset of 1:N, i.e. its size is smaller or equal to N. For example, N=4, and c=[1 2 4]'; Then, is there a more elegant way to achieve this?
cc = [];
for j = 1:N
if ismember(j,c)
cc = [cc; N*(j-1)+c];
end
end
Thanks!
2 Comments
Accepted Answer
Andrei Bobrov
on 23 Jun 2017
Edited: Andrei Bobrov
on 23 Jun 2017
[Fixed]
N = 15;
c = randperm(N,4);
c1 = sort(c(:));
cc = reshape(bsxfun(@plus,N*(c1 - 1),c1')',[],1);
or
oc = ones(numel(c1),1);
cc = N*(kron(c1,oc) - 1) + kron(oc,c1);
or
c = c(:);
nn = numel(c);
cc = N*(repelem(c,nn) - 1) + repmat(c,nn,1);
6 Comments
Stephen23
on 23 Jun 2017
@Christian: With the data you have shown us cc will definitely be a matrix. If c is a column vector then you should specify this in your question.
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!