Использование SUM и UNIQUE для подсчета вхождений значения в подмножестве матрицы - PullRequest
3 голосов
/ 20 марта 2012

Итак, предположим, что матрица выглядит следующим образом:

20 2
20 2
30 2
30 1
40 1
40 1

Я хочу подсчитать, сколько раз 1 встречается для каждого уникального значения в столбце 1. Я мог бы сделать это долгий путь с помощью [sum (x)(1: 2,2) == 1)] для каждого значения, но я думаю, что это было бы идеальным использованием для УНИКАЛЬНОЙ функции.Как я мог исправить это так, чтобы я мог получить вывод, подобный этому:

20 0
30 1
40 2

Извините, если решение кажется очевидным, мое понимание циклов очень плохое.

Ответы [ 3 ]

2 голосов
/ 20 марта 2012

Действительно уникальным является хороший вариант:

u=unique(x(:,1))
res=arrayfun(@(y)length(x(x(:,1)==y & x(:,2)==1)),u)

Разбирая эту последнюю строку:

  1. arrayfun (fun, array) применяет fun к каждому элементу в массиве и помещает его в новый массив, который он возвращает.
  2. Эта функция является функцией @(y)length(x(x(:,1)==y & x(:,2)==1)), которая находит длину части x, где выполняется условие x(:,1)==y & x(:,2)==1) (называемое логическим индексированием). Таким образом, для каждого из уникальных элементов он находит строку в X, где первый - уникальный элемент, а второй - один.
1 голос
/ 26 июня 2014

Предположим, у вас есть массив различных целых чисел в 'массиве'

функция tabulate будет сортировать уникальные значения и подсчитывать вхождения.

table = tabulate(array)

найдите ваши уникальные значения в столбце 2 таблицы.

1 голос
/ 20 марта 2012

Попробуйте это (как указано в этот ответ ):

>>> [c,~,d] = unique(a(a(:,2)==1))
c =
    30
    40

d =
    1
    3

>>> counts = accumarray(d(:),1,[],@sum)
counts =
    1
    2

>>> res = [c,counts]
...