Matlab, comparing array using if statement

后端 未结 3 1595
猫巷女王i
猫巷女王i 2021-01-19 10:04

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         


        
相关标签:
3条回答
  • 2021-01-19 10:17

    Here is how I would do it:

    1. Create logical indices for each condition (element greater/less than row/col median)
    2. Use the logical indices to update MedianMap.

    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:

    • meshgrid expands 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 matrices
    • MedianMap(L), where L is a logical index (boolean matrix), selects the elements of MedianMap corresponding to the elements of L which are true.
    0 讨论(0)
  • 2021-01-19 10:19
    MedianMap  = (A > Rmedian'*ones(1,4))+ ( A > ones(3,1)*Cmedian) -1
    
    0 讨论(0)
  • 2021-01-19 10:29

    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 ); 
    
    0 讨论(0)
提交回复
热议问题