4

我已经搜索了网络,试图找到我遇到的这个问题的答案。

我有一个类似于以下的数组

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 中挣扎。

4

3 回答 3

1

这是我的做法:

  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_mediancol_median变成大小相同的数组A
  • A > yMedian返回一个大小相同的矩阵,其中包含将 的每个元素与 的对应元素A进行比较的布尔结果。AxMedian
  • isRowHigh & isColHigh执行布尔矩阵的元素与
  • MedianMap(L),其中L是逻辑索引(布尔矩阵),选择MedianMap对应于其中元素为L真的元素。
于 2012-10-02T02:10:05.760 回答
1

我会这样做:

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

这个是多线程的(适用于更大的问题),并且没有其他答案中涉及的任何临时变量(更小的峰值内存占用)。

虽然它不是很漂亮:)所以如果你想要更好的可读性,请使用meshgridBrianL的答案,或者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 ); 
于 2012-10-02T04:59:52.680 回答
-1
MedianMap  = (A > Rmedian'*ones(1,4))+ ( A > ones(3,1)*Cmedian) -1
于 2012-10-02T02:12:12.103 回答