Find minimum in groups defined by cell arrays
7 ビュー (過去 30 日間)
古いコメントを表示
I have a cell array I and a vector X. Each item in I specifies a group of indices of items in X. I would like to find the minimum in each group.
The naive code which does the work is
M = zeros(size(I))
for i = 1:numel(I)
M(i) = min(X(I{i}));
end
Or alternatively
M = cellfun(@(idx) min(X(idx)), I);
Both approaches are not as fast as I would like. Is there any way to make it faster? For example, transform the input, somehow, into a valid input of `splitapply' or something similar?
3 件のコメント
Matt J
2018 年 12 月 26 日
You had to have used a for-loop just to create I. Are you sure that's not going to bottleneck your code even if you did manage to accelerate the min operations?
回答 (1 件)
Matt J
2018 年 12 月 26 日
編集済み: Matt J
2018 年 12 月 26 日
Cell arrays aren't built for speed. Instead of keeping I as a cell array, therefore, it would be better to encode the same information in the columns of a sparse binary matrix,
for i=1:N
I{i}=indices(:).'; %computed somehow
J{i}=ones(1,numel(indices));
end
S=sparse([I{:}],[J{:}],true,numel(X), numel(I));
Now, you can do your computation as follows,
xmax=max(X(:));
M = xmax - max((xmax-X(:)).*S,[],1);
3 件のコメント
Image Analyst
2018 年 12 月 26 日
Like Matt said, I bet it's that you are using cell arrays, not that you're using a for loop. For loops are fast now. I just did a for loop (doing nothing inside) of one hundred million iterations and it took 0.09 seconds. I don't know how many iterations you're doing or what kind of speed/times you're getting but I'm pretty sure it's not the for loop itself causing a slow program. I bet it's the cell array. But even cell arrays are not that slow unless there are lots of cells, like tens of thousands, not a few dozen. What times are you seeing?
参考
カテゴリ
Help Center および File Exchange で Loops and Conditional Statements についてさらに検索
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!