Я думаю, у вас может быть ошибка, когда вы проверяете, принадлежит ли X бункеру.Вы можете получить несколько корзин для значений X, которые попадают в BinLimits.
X >= BinLimit(j) & X <= BinLimit(j+1)
В любом случае, поскольку вы запросили решение для цикла, вот тот, который работает лучше, чем ваш метод 2.
j=1;
i=1;
while i<=N
while i<=N && X(i)<=BinLimit(j+1)
i=i+1;
end
Freq(j) = i-1;
j = j+1;
end
Freq=diff([0 Freq]);
Требуется сортировка X, как в вашем коде.Ниже приведены временные параметры для всех обсуждаемых методов для отсортированного массива X (Histc также работает быстрее для отсортированного X, так что это справедливое сравнение):
Sort
===========
Elapsed time is 0.019205 seconds.
Method #1
=========
Elapsed time is 0.209979 seconds.
histc
=====
Elapsed time is 0.009595 seconds.
Alternative
===========
Elapsed time is 0.228400 seconds.
Method 2
===========
Elapsed time is 0.025400 seconds.
my method
===========
Elapsed time is 0.011920 seconds.
bsxfun by Amro
===========
Elapsed time is 0.179937 seconds.
Как видите, эта структура цикла работает почти так же, какhistc (на 25% хуже).
Это было для отсортированного X (время сортировки также указано в приведенном выше результате).Вот результаты работы с отчетами для несортированных массивов (тот же X, что и выше, перестановка со случайной перестановкой)
histc
=====
Elapsed time is 0.030367 seconds.
Как вы видите, время сортировки и подсчета в отсортированных массивах вместе аналогично запускув несортированном массиве.