Hi, I am trying to vectorize following for loop. Need some help??

조회 수: 1 (최근 30일)
Parag Patil
Parag Patil 2016년 1월 26일
댓글: Parag Patil 2016년 1월 26일
accumulator=zeros(numThetas,numRhos);
accx_n=zeros(numEdgePixels,numThetas);
for j=1:numThetas
accumulator(j,:)=[0 histcounts(accx_n(:,j),rho)];
end
  댓글 수: 2
Walter Roberson
Walter Roberson 2016년 1월 26일
We do not know whether rho is a scalar (acting as a bin count) or a vector (acting as edge information)
Parag Patil
Parag Patil 2016년 1월 26일
Its a row vector. Say, rho=[-1.3415:1:1.3415] Thank you.

댓글을 달려면 로그인하십시오.

채택된 답변

Guillaume
Guillaume 2016년 1월 26일
This is a case where the 'old' histogram functions work better than the newer one. If you pass a matrix to histc, it returns the histogram of each column, exactly what you're doing right now with your loop.
You have to watch out that histc and histcounts do not behave exactly the same with regards to the edges (assuming rho is an edge vector), so you may have to modify your rho slightly.
accumulator = [zeros(size(accx_n, 1), 1), histc(accx_n, rho)]
  댓글 수: 3
Guillaume
Guillaume 2016년 1월 26일
편집: Guillaume 2016년 1월 26일
Unfortunately, there's no workaround for histcounts. The best you could do is parallelise the loop with parfor.
edit: saying that you can reproduce your usage of histcounts with discretize and accumarray. As discretize uses the same binning method as histcounts you 'll get exactly the same result:
bins = discretize(accx_n, rho);
rows = repmat(1:size(accx_n, 2), size(accx_n, 1), 1);
accumulator = [zeros(size(accx_n, 2), 1) accumarray([rows(:), bins(:)], 1)]
No guarantee that it is faster than the loop, due to the matrix resizing of rows and bins.
Parag Patil
Parag Patil 2016년 1월 26일
Thanks..histc worked but I will try this one too.

댓글을 달려면 로그인하십시오.

추가 답변 (0개)

카테고리

Help CenterFile Exchange에서 Loops and Conditional Statements에 대해 자세히 알아보기

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by