У меня есть набор значений, и я хочу выяснить, к какой ячейке каждый из них принадлежит более компактным, вероятно векторизованным и, что наиболее важно, быстрее, чем приведенный ниже,

values = rand(1,3)*50;
bins = 0:10:50;
binValues = nan(size(values));
for valueIndex = 1:length(values)
    dif = bins - values(valueIndex);
    [~,locat] = min(abs(dif));
    %to see on which side it is
    if dif(locat)>0
        locat = locat - 1;
    end
    %if its outside the bins:
    if locat==0 || locat==length(bins)
        locat=nan;
    end
    binValues(valueIndex) = locat;
end

values
bins 
binValues

Например,

values =

   28.6037   37.7998   30.8294


bins =

     0    10    20    30    40    50


binValues =

     3     4     4
0
myradio 21 Фев 2021 в 23:14

1 ответ

Лучший ответ

Возможно, взгляните на discretize MATLAB функция введена в R2015a. С помощью этой функции вы можете заменить свой цикл на:

binValues = discretize(values, bin, 'IncludeEdge', 'right');

Вы можете назначить значения на краях бункера для левого или правого бункера с помощью параметра IncludeEdge. Например, принадлежит ли 10 контейнеру 1 (например: ..., "IncludeEdge", "left") или контейнеру 2 (например, ..., "IncludeEdge", "right").

Наконец, обратите внимание, что значениям за пределами диапазона ячеек будет присвоено значение ящика NaN.

2
Azim J 24 Фев 2021 в 17:06