【问题标题】:Matlab using accumarray with cell arrayMatlab 使用 accumarray 和单元格数组
【发布时间】:2014-02-03 16:56:49
【问题描述】:

我对 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

所以我想在“键”列中合并具有相同数字的行。同时,我想将“销售额”和“重量”列相加,并保留“名称”列(每个“键”具有相同的“名称”,但每个“名称”可以有多个“键”)

我知道这可以通过 for 循环实现,但由于我必须以类似但不同的方式操作大量表,因此这是计算密集型的。

我读过类似的问题,这可以使用 accumarray 来解决,但是这可以使用 accumarray 来完成吗?那会是什么样子?

【问题讨论】:

  • 您能否举例说明您的元胞数组是如何存储的?它有标题吗?整个key 列是一个数组,sales 是一个数组等吗?

标签: mysql arrays matlab accumarray


【解决方案1】:

这是使用accumarray 的一种方法,但可能值得您考虑新的table 数据结构而不是单元矩阵(我相信您可以轻松转换为它)

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]

【讨论】:

  • 像魅力一样工作。谢谢你。我来看看Matlab引入的新表和分类数组!
【解决方案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 用于获取总和。

【讨论】:

  • 我想你的意思是y=[x(b,2), num2cell(sparse(1,c,[x{:,3}]))', num2cell(sparse(1,c,[x{:,4}]))', x(b,[5])]?为什么sparse 总和?
  • @Dan:你说得对,我只计算了销售额,没有计算重量。检查sparse([1,1],[1,1],[2,3]) 了解如何使用sparse 计算总和。
  • 恐怕还是没看懂。我认为可能值得为您的答案添加解释。
  • 如果将两个值分配给同一个索引,sparse 使用总和。我认为 user3193435 应该使用您的答案,accumarray 它可能更容易理解。
  • 我在我的桌子上测试了它,它工作了!非常感谢。
猜你喜欢
  • 2013-06-19
  • 1970-01-01
  • 2015-08-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-25
  • 1970-01-01
相关资源
最近更新 更多