addition of one column with certain condition in another colum, like sumifs of excel

前端 未结 1 819
醉梦人生
醉梦人生 2021-01-28 03:00

I have a matrix like this

A=[ 1 2; 2 3; 3 4; 4 5; 5 6; 6 8; 7 9; 8 5; 9 4]

Now I want to add a second column the condition is that if limit=0,

相关标签:
1条回答
  • 2021-01-28 03:14

    This is a job for ACCUMARRAY. First, you construct an array of indices of the values that should be added together, then you call accumarray:

    %# create test data
    A=[ 1 2; 2 3; 3 4; 4 5; 5 6; 6 8; 7 9; 8 5; 9 4];
    
    %# create indices from first column
    %# if you have indices already, you can use them directly
    %#   or you can convert them to consecutive indices via grp2idx
    groupIdx = ceil(A(:,1)/3); %# 0+ to 3 is group 1, 3+ to 6 is group 2, etc
    
    %# sum
    result = accumarray(groupIdx,A(:,2),[],@sum)
    
    result =
         9
        19
        18
    

    EDIT

    If you need instead to count entries within the ranges, it is still a job for accumarray, only that you don't accumulate into a sum, but into a histogram.

    %# use test data, groupIdx from above
    A=[ 1 2; 2 3; 3 4; 4 5; 5 6; 6 8; 7 9; 8 5; 9 4];
    groupIdx = ceil(A(:,1)/3); %# 0+ to 3 is group 1, 3+ to 6 is group 2, etc
    
    %# find values to count
    values2count = unique(A(:,2));
    
    %# count the values
    countsPerRange = accumarray(groupIdx,A(:,2),[],@(x){hist(x,values2count)})
    
    
    %# inspect the counts for range #1
     [values2count,countsPerRange{1}']
    
    ans =
    
         2     1
         3     1
         4     1
         5     0
         6     0
         8     0
         9     0
    
    0 讨论(0)
提交回复
热议问题