как эффективно хранить данные в Matlab - PullRequest
1 голос
/ 30 сентября 2019

Я хочу скопировать некоторые данные в соответствии с некоторыми «шагами», здесь 1:10. Так что bin{1} должно содержать значения >=steps(1) & <steps(2) и т. Д.

Мне интересно, могу ли я получить некоторые советы / отзывы от сообщества, поставить вопрос: есть ли какая-то распространенная практика для сбора данных, которые у меня нет? Пока не найдено, можно ли улучшить код с точки зрения эффективности и читабельности?

data=abs(sin(0:.1:10)*10); %example data
steps=1:10; %user-defined bins
betw=@(x,mi,ma) x(x>=mi & x<ma); %function that returns values between minimum/maximum

bin={};
for ind=1:numel(steps)-1
  bin{ind}=betw(data,steps(ind),steps(ind+1));
end
bin

bin =

  1×9 cell array

  Columns 1 through 7

    {1×7 double}    {1×7 double}    {1×7 double}    {1×8 double}    {1×9 double}    {1×7 double}    {1×10 double}

  Columns 8 through 9

    {1×11 double}    {1×27 double}

1 Ответ

2 голосов
/ 30 сентября 2019

Функция histcounts будет "стандартным" способом сделать это:

data = abs(sin(0:.1:10)*10); %example data
steps = 1:10;                %user-defined bins

hc = histcounts( data, steps );
>> hc = 
  [ 7 7 7 8 9 7 10 11 27 ]

Обратите внимание, что hc на один элемент меньше, чем steps, потому что steps определяет края бункера. Общее число sum(hc) равно количеству элементов в data, которое попало между самым низким и самым высоким бинами - в этом случае меньше, чем numel(data), потому что некоторые элементы data имеют более низкое значение, чем ваш самый низкий бин вsteps.

В histcounts имеется множество опций для возврата ребер ячейки, указания количества корзин, а не ребер, возврата номера ячейки для каждого элемента и т. Д. *

Если все, что вам на самом деле нужно, - это гистограмма (отмеченная в вашем комментарии), вы можете использовать histogram, который вызывает histcounts скрытые данные для вычисления, но также выводит цифру.

histogram( data, steps );

histogram

...