Multiply elements in second column according to labels in the first

后端 未结 3 753
情歌与酒
情歌与酒 2020-12-21 06:49

I\'m working in Matlab. I have a two-dimensional matrix with two columns. Lets consider elements in the first column as labels. Labels may be repeated.

How to mult

相关标签:
3条回答
  • 2020-12-21 07:39

    Try something like this, I'm sure it can be improved...

    unValues = unique(matrix(:,1));
    bb = ones(size(unValues));
    
    for ii = 1:length(unValues)
        bb(ii) = bb(ii)*prod(matrix(matrix(:, 1) == unValues(ii), 2));
    end
    
    a = [unValues bb];
    
    0 讨论(0)
  • 2020-12-21 07:42

    I would use accumarray. The preprocessing with unique assigns integer indices 1:n to the values in the first row, which allow accumarray to work without creating unnecessary bins for 2 and 4. It also enables the support for negative numbers and floats.

    [ulable,~,uindex]=unique(matrix(:,1))
    r=accumarray(uindex,matrix(:,2),[],@prod)
    r=[ulable,r]
    

    /You can also use splitapply:

    [ulable,~,uindex]=unique(matrix(:,1))
    r=splitapply(@prod,matrix(:,2),uindex)
    r=[ulable,r]
    
    0 讨论(0)
  • 2020-12-21 07:52

    You can do it without loops using accumarray and the prod function:

    clear
    clc
    
    
    matrix = [1,3,3,1,5; 2,3,7,8,3]';
    
    A = unique(matrix,'rows');
    
    group = A(:,1);
    
    data = A(:,2);
    
    indices = [group ones(size(group))];
    
    prods = accumarray(indices, data,[],@prod); %// As mentionned by @Daniel. My previous answer had a function handle but there is no need for that here since prod is already defined in Matlab.
    
    a = nonzeros(prods)
    
    Out = [unique(group) a]
    
    Out =
    
         1    16
         3    21
         5     3
    

    Check Lauren blog's post here, accumarray is quite interesting and powerful!

    0 讨论(0)
提交回复
热议问题