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 );
Вот как я бы это сделал:
- Создать логические индексы для каждого условия (элемент больше / меньше, чем медиана строки / столбца)
- Используйте логические индексы для обновления 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