I have searched the net trying to find an answer to this problem I have.
I have an array much like the following
A = [2 4 6 8 ; 3 5 7 9 ; 1 4 6 9]
r
Here is how I would do it:
In code:
[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;
Notes:
row_median
and col_median
into arrays of the same size as A
A > yMedian
returns a matrix of the same size as A
containing the boolean results of comparing every element of A
with the corresponding element of xMedian
.isRowHigh & isColHigh
performs an element-wise AND of the boolean matricesMedianMap(L)
, where L
is a logical index (boolean matrix), selects the elements of MedianMap
corresponding to the elements of L
which are true.MedianMap = (A > Rmedian'*ones(1,4))+ ( A > ones(3,1)*Cmedian) -1
Here's how I would do that:
MedianMap = ...
( bsxfun(@gt,A,col_median) & bsxfun(@gt,A,row_median.') ) - ...
( bsxfun(@lt,A,col_median) & bsxfun(@lt,A,row_median.') );
This one is multi-threaded (suited for much larger problems) and doesn't have any of the temporaries involved in the other answers (much smaller peak memory footprint).
It's not very pretty though :) So if better readability is what you're after, use either meshgrid
as in BrianL's answer, or 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 );
or multiplication by a ones-matrix as Rasman did:
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 );