Как изменить матрицу, используя условие if и команду find? - PullRequest
0 голосов
/ 24 января 2019

Предположим, что у меня есть

dat_h=[1 0.12; 1 0.77; 2 0.37; 2 0.11; 3 0.44; 3 0.41; 4 0.91; 4 0.71; 5 0.51; 5 1.5]; 
dcat=1:5; 
hcat=[0.1 0.3 0.6 0.8 1.0];

Я хочу иметь матрицу

nx= 
[ 2 1 1 0 0;
  2 1 0 0 0;
  2 2 0 0 0; 
  2 2 2 1 0; 
  2 2 1 1 1]

, который содержит число вхождений всех значений во втором столбце dat_h, которое больше, чем каждый элемент hcat (в столбцах), где строки nx представляют dcat.

Я пытался использовать этот код:

for i=1:length(dcat)
  for j=1:length(hcat)
    for k=1:length(dat_h)
      if i==dat_h(k,1)
        nx(i,j)=length(find(dat_h>=hcat(j)));
      else
        continue
      endif
    endfor
  endfor  
endfor

То, что у меня есть, это просто nx=1.

Ответы [ 2 ]

0 голосов
/ 24 января 2019

Вы можете получить то, что вы хотите с помощью следующего однострочного:

accumdim ( dat_h(:,1), dat_h(:,2) >= hcat )

Загляните в документацию для АКБ, если вы хотите понять, как она работает.

0 голосов
/ 24 января 2019

Вам нужна кумулятивная 2D гистограмма. Что касается того же вопроса , вам просто нужно вычислить 2D гистограмму, используя hist3, а затем использовать cumsum, чтобы получить кумулятивный результат. Обратите внимание, что filplr используется для накопления от конца к началу:

dcat = [dcat inf];
hcat = [hcat inf];
pkg load statistics
[obs, ~] = hist3(dat_h ,'Edges', {dcat,hcat});
nx = fliplr(cumsum(fliplr(obs),2));
...