我对Matlab很新,但我对其他编程语言有一些经验。我在Matlab中从MySQL导入了一个非常大的表。它以单元格数组的形式给出,如下所示:
date key sales weight name
12/11 101 1200 20 blue
12/11 178 1200 70 purple
13/11 209 1300 15 purple
12/11 101 1200 10 blue
14/11 678 1200 10 yellow
12/11 340 1500 30 green
17/11 178 1900 50 purple
我希望输出为:
key sales weight name
101 2400 30 blue
178 3100 120 purple
209 1300 15 purple
678 1200 10 yellow
340 1500 30 green
所以我想在'key'列中组合具有相同编号的行。同时我想总结“销售”和“权重”这一列,并保留“名称”栏目(每个“键”具有相同的“名称”,但每个“名称”可以有多个“键”)
我知道这可以通过for循环来实现,但是由于我不得不以类似但不同的方式操作很多表,这是计算密集型的。
我已经阅读了类似的问题,这可以使用accumarray来解决,但是这可以通过使用sub作为单元阵列的accumarray来完成吗?那怎么样?
答案 0 :(得分:3)
以下是使用accumarray
的一种方法,但是考虑新的table数据结构而不是单元格矩阵可能值得您花些时间(我确信您可以轻松转换为它)< / p>
T = { 101 1200 20 'blue'
178 1200 70 'purple'
209 1300 15 'purple'
101 1200 10 'blue'
678 1200 10 'yellow'
340 1500 30 'green'
178 1900 50 'purple'};
[u, ind, x] = unique([T{:,1}])
key = T(ind,1)
sales = accumarray(x', [T{:,2}])
weight = accumarray(x', [T{:,3}])
name = T(ind,4)
[key, num2cell(sales), num2cell(weight), name]
答案 1 :(得分:2)
x={ '12/11' 101 1200 20 'blue'
'12/11' 178 1200 70 'purple'
'13/11' 209 1300 15 'purple'
'12/11' 101 1200 10 'blue'
'14/11' 678 1200 10 'yellow'
'12/11' 340 1500 30 'green'
'17/11' 178 1900 50 'purple'};
[~,b,c]=unique([x{:,2}]);
y=[x(b,2),...
num2cell(sparse(1,c,[x{:,3}]))',...
num2cell(sparse(1,c,[x{:,4}]))',...
x(b,[5])];
unique
用于获取重复键的索引。 sparse
用于获得总和。