Matlab,使用if语句比较数组

时间:2012-10-02 01:33:43

标签: arrays matlab if-statement matrix median

我在网上搜索试图找到这个问题的答案。

我有一个类似下面的数组

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" 1"被分配到中位数地图
  • 如果该值小于行和列中位数a" -1"被分配到中位数地图
  • 否则为0?

如何遍历" A"中的每一行和每一行?数组并将其与各自的列和行中位数相关联?

我已经用C代码编写了代码并且它很成功,但是只是在Matlab中挣扎。

3 个答案:

答案 0 :(得分:1)

我将如何做到这一点:

  1. 为每个条件创建逻辑索引(元素大于/小于行/列中位数)
  2. 使用逻辑索引更新MedianMap。
  3. 在代码中:

    [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;
    

    注意:

    • meshgridrow_mediancol_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}中的meshgridrepmat

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