Найти среднее значение в массиве, которое удовлетворяет условию - PullRequest
2 голосов
/ 24 января 2020

У меня есть логический массив (нули и единицы) 1500x700

Я хочу найти «1» в каждом столбце, и когда в столбце более одного «1», я должен выбрать средний.

Возможно ли это сделать? Я знаю, как найти «1», но не знаю, как извлечь середину «1», если в одном столбце есть пара «1».

Ответы [ 2 ]

1 голос
/ 25 января 2020

Вы можете

  1. Получить индексы строк и столбцов единиц с find;
  2. Применить accumarray с пользовательская функция для получения индекса средней строки для каждого столбца.

x = [1 0 0 0 0; 0 0 1 0 0; 1 0 1 0 0; 1 0 0 1 0];                      % example
[ii, jj] = find(x);                                                    % step 1
result = accumarray(jj, ii, [size(x,2) 1], @(x) x(ceil(end/2)), NaN);  % step 2

Обратите внимание, что:

  • Для четного числа из них это дает первые из двух средних индексов. Если вы предпочитаете среднее из двух средних индексов, замените @(x) x(ceil(end/2)) на @median.
  • Для столбца без единиц это даст NaN в качестве результата. Если вы предпочитаете другое значение, замените входной пятый аргумент accumarray этим.

Пример:

x =
     1     0     0     0     0
     0     0     1     0     0
     1     0     1     0     0
     1     0     0     1     0

result =
     3
   NaN
     2
     4
   NaN
1 голос
/ 24 января 2020

Функция find возвращает ваши индексы.

>> example=[1,0,0,1,0,1,1];
>> indices=find(example)

indices =

     1     4     6     7

>> indices(floor(numel(indices)/2))

ans =

     4

Сделайте это для каждого столбца, и у вас есть решение.

...