Matlab, сравнивающий массив с помощью оператора if

Я искал в сети, пытаясь найти ответ на эту проблему, которую я имею.

У меня есть массив, похожий на следующий

A = [2 4 6 8 ; 3 5 7 9 ; 1 4 6 9]

row median = [ 5 6 5 ]
col median = [ 2 4 6 9 ]

Из этих значений я хочу создать срединную карту. Итак, я создал массив

MedianMap = int8(zeros(MAX_ROWS, MAX_COLS))

В этом массиве я хочу назначить три разных значения: 1, 0, -1. Таким образом, вывод медианной карты будет иметь такой же размер массива 'A':

  • если значение больше, чем медиана строки и столбца, медианной карте присваивается "1"
  • если значение меньше медианы как строки, так и столбца, медианной карте присваивается "-1"
  • иначе 0?

Как я могу пройти через каждую строку и столбец в массиве "A" и связать его с соответствующим столбцом и медианой строки?

Я написал код на C-коде, и он был успешным, но только в Matlab.

3 ответа

Вот как бы я это сделал:

MedianMap = ...
    ( bsxfun(@gt,A,col_median) & bsxfun(@gt,A,row_median.') ) - ...
    ( bsxfun(@lt,A,col_median) & bsxfun(@lt,A,row_median.') );

Этот многопоточный (подходит для гораздо больших задач) и не имеет временных переменных, участвующих в других ответах (намного меньший пиковый объем памяти).

Хотя это не очень красиво:) Так что если вам нужна лучшая читабельность, используйте либо meshgrid как в ответе BrianL, или repmat:

Col_median = repmat(col_median, size(A,1),1);
Row_median = repmat(row_median.', 1, size(A,2));

MedianMap = ...
    ( A > Col_median & A > Row_median ) - ... 
    ( A < Col_median & A < Row_median ); 

или умножение на матрицу единиц, как это сделал Расман:

Col_median = ones(size(A,1),1) * col_median;
Row_median = row_median.' * ones(1,size(A,2));

MedianMap = ...
    ( A > Col_median & A > Row_median ) - ... 
    ( A < Col_median & A < Row_median ); 

Вот как я бы это сделал:

  1. Создать логические индексы для каждого условия (элемент больше / меньше, чем медиана строки / столбца)
  2. Используйте логические индексы для обновления MedianMap.

В коде:

[xMedian, yMedian] = meshgrid(col_median, row_median);

isRowHigh = (A > yMedian);
isColHigh = (A > xMedian);

isRowLow = (A < yMedian);
isColLow = (A < xMedian);

MedianMap(isRowHigh & isColHigh) = 1;
MedianMap(isRowLow & isColLow) = -1;

Заметки:

  • meshgrid раскрываться row_median а также col_median в массивы того же размера, что и A
  • A > yMedian возвращает матрицу того же размера, что и A содержащий булевы результаты сравнения каждого элемента A с соответствующим элементом xMedian,
  • isRowHigh & isColHigh выполняет поэлементное И булевых матриц
  • MedianMap(L), где L является логическим индексом (логическая матрица), выбирает элементы MedianMap соответствующие элементам L которые являются правдой.
MedianMap  = (A > Rmedian'*ones(1,4))+ ( A > ones(3,1)*Cmedian) -1
Другие вопросы по тегам