2012-07-03 4 views
2

Рассмотрим это:MatLab - histc со многими краями вектора

a = [1 ; 7 ; 13]; 
edges = [1, 3, 6, 9, 12, 15]; 

[~, bins] = histc(a, edges) 

bins = 

    1 
    3 
    5 

Теперь я хотел бы иметь тот же результат, но с другим вектором «ребрами» для каждого a значения, т.е. матрицы вместо вектора для ребер. Exemple:

a = [1 ; 7 ; 13]; 
    edges = [ 1, 3, 6 ; 1, 4, 15 ; 1, 20, 30]; 

edges = 

    1  3  6 
    1  4 15 
    1 20 30 


    indexes = theFunctionINeed(a, edges); 

    indexes = 
      1 % 1 inside [1, 3, 6] 
      2 % 7 indide [1, 4, 15] 
      1 %13 inside [1, 20, 30] 

Я мог бы сделать это с histc внутри for петли, с помощью я пытаюсь избежать петли.

ответ

2

Если вы превратить ваши массивы Массивы ячеек, вы можете попробовать

a = {1 ; 7 ; 13}; 
edges = {[ 1, 3, 6 ];[ 1, 4, 15] ; [1, 20, 30]}; 

[~, indexes] = cellfun(@histc, a, edges,'uniformoutput', false) 

Это приводит к

indexes = 

    [1] 
    [2] 
    [1] 

~ редактировать ~

Чтобы превратить ваши матрицы в клеточные массивы вас могут использовать num2cell:

a = num2cell(a); 
edges = num2cell(edges, 2); 
+0

есть простой способ перейти от матрицы к cellarray? – Johnny5

+0

@ Johnny5: см. Мой обновленный ответ. –

2

Вы также можете сделать:

a = [1; 7; 13]; 
edges = [1 3 6; 1 4 15; 1 20 30]; 

bins = sum(bsxfun(@ge, a, edges), 2) 

Результат:

>> bins 
bins = 
    1 
    2 
    1 
+0

Есть ли увеличение производительности по сравнению с решением H.Muster? – Johnny5

+0

Мне нравится, когда мне не нужно преобразовывать матрицу в массив ячеек. – Johnny5

+0

@ Johnny5: вы можете проверить оба подхода. Создавайте большие данные и используйте tic/toc, чтобы сравнить время ... Я подозреваю, что это быстрее, но не верьте мне на слово :) – Amro

 Смежные вопросы

  • Нет связанных вопросов^_^