我在网上搜索试图找到这个问题的答案。
我有一个类似下面的数组
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':
的大小相同如何遍历" A"中的每一行和每一行?数组并将其与各自的列和行中位数相关联?
我已经用C代码编写了代码并且它很成功,但是只是在Matlab中挣扎。
答案 0 :(得分:1)
我将如何做到这一点:
在代码中:
[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
元素为真。答案 1 :(得分:1)
我将如何做到这一点:
MedianMap = ...
( bsxfun(@gt,A,col_median) & bsxfun(@gt,A,row_median.') ) - ...
( bsxfun(@lt,A,col_median) & bsxfun(@lt,A,row_median.') );
这个是多线程的(适用于更大的问题)并且没有任何临时参与其他答案(更小的峰值内存占用)。
虽然它不是很漂亮:)所以如果你想要的是更好的可读性,可以使用Brian {@ 1}中的meshgrid
或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 );
或者像Rasman那样乘以一个矩阵:
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 );
答案 2 :(得分:-1)
MedianMap = (A > Rmedian'*ones(1,4))+ ( A > ones(3,1)*Cmedian) -1