找到最大值并将其他值更改为零

时间:2014-05-23 09:46:25

标签: arrays matlab

我有3个相同大小的矢量,如:
x = [1 2 3 3 4 5 5 5]
A = [30 40 50 52 60 70 73 71]
B = [10 20 40 50 40 30 20 40]
现在我想在x中看到并找到x中相同值(3,3)(5,5,5)的索引 然后在B(40,50)(30 20 40)中查看相同指数的值,然后将此值改为仅有最大值,另一个为0.这意味着我的resualt为
Bx=[10 20 0 50 40 0 0 40]
然后使用这个非零值Bx的索引将A的值作为
Abx=[30 40 0 52 0 0 71]

任何人都可以帮助我吗?

1 个答案:

答案 0 :(得分:3)

  1. 使用accumarray

    Bx = accumarray(x(:), B(:), [], @(x) {(x==max(x)).'*max(x)});
    Bx = horzcat(Bx{:});
    Abx = A.*(Bx~=0);
    
  2. 使用bsxfun

    e = double(bsxfun(@eq, x(:), x(:).'));
    e(e==0) = NaN;
    ind = max(bsxfun(@times, e, B(:)))==B;
    Bx = B.*ind;
    Abx = A.*ind;
    

  3. 要一次为多行执行此操作(xAB现在是矩阵):将第一个维度发送到第三个维度(使用permute)和按上述方式工作:

    e = double(bsxfun(@eq, permute(x, [2 3 1]), permute(x, [3 2 1])));
    e(e==0) = NaN;
    ind = squeeze(max(bsxfun(@times, e, permute(B, [2 3 1])))).'==B;
    Bx = B.*ind;
    Abx = A.*ind;
    

    示例:

    x = [1     2     3     3     4     5     5     5
         3     2     4     4     4     5     5     5]
    A = [30    40    50    52    60    70    73    71
         71    73    70    60    52    50    40    30]
    B = [10    20    40    50    40    30    20    40
         40    20    30    40    50    40    20    10]
    

    结果

    Bx =
        10    20     0    50    40     0     0    40
        40    20     0     0    50    40     0     0
    
    Abx =
        30    40     0    52    60     0     0    71
        71    73     0     0    52    50     0     0