什么是MATLAB-ish方法"直方图化"一个排序的单元格数组?

Sib*_*ing 3 matlab cell-array

假设我运行了7/11,并且100x3按照第一列时间排序的以下单元格数组是我的销售记录.

12:32:01 customer1 12
12:32:02 customer2 13
12:32:04 customer6 4
12:32:06 customer8 6
12:32:07 customer1 9
12:32:07 customer1 6
12:32:12 customer2 1
...
Run Code Online (Sandbox Code Playgroud)

正如您所注意到的,每个客户都可以多次购物.例如,客户1实际上做了三种不同的付款

我现在想计算每个客户的平均付款额. 例如,让我们假设客户1只进行了3次付款,如上所示.然后,他的平均付款将是(12+9+6)/3=9.

我当然可以写一个for循环来循环遍历所有条目并保持每个客户的轨道.但是,我觉得这不是用MATLAB完成的.

那么完成任务的MATLAB最简单的方法是什么?

cha*_*pjc 5

首先unique为每个客户获取一个整数"密钥",然后将其输入accumarray@mean函数句柄中:

data = {'12:32:01','customer1',12; '12:32:02','customer2',13;...
        '12:32:04','customer6',4; '12:32:06','customer8',6;...
        '12:32:07','customer1',9; '12:32:07','customer1',6;...
        '12:32:12','customer2',1};
[customers,~,ic] = unique(data(:,2));
avePayment = accumarray(ic,[data{:,3}],[],@mean);
Run Code Online (Sandbox Code Playgroud)

然后汇编输出:

>> custAvgTab = [customers num2cell(avePayment)]

custAvgTab = 

    'customer1'    [9]
    'customer2'    [7]
    'customer6'    [4]
    'customer8'    [6]
Run Code Online (Sandbox Code Playgroud)

恕我直言,这是相当MATLAB-ish,实际上非常直观.

注意:我更换了cell2mat(data(:,3)),[data{:,3}]因为我认为最好在可能的情况下使用内置的MATLAB操作.

注2:对于大数据,sprintfc('%d',avePayment)可能比更快num2cell(avePayment).