【问题标题】:grouping and summing (evaluating functions) on matrix-values in matlabmatlab中矩阵值的分组和求和(评估函数)
【发布时间】:2013-08-30 02:02:10
【问题描述】:

这里的许多线程表明accumarray 是 matlab 中按索引集对值进行分组(和计算)的答案。由于这工作得又快又好,我需要为更大的(ND)数据字段设置类似的东西。
让我们假设一个例子:我们有一个名字向量,里面有(非唯一的)名字,还有一个按列显示不同项目收益的数据向量

names=str2mat('Tom','Sarah','Tom','Max','Max','Jon');
earnings=[100 200 20;20 100 500;1 5 900; 100 200 200;200 200 0; 300 100 -250];

现在我们要计算每个名称的列总和。
好的,我们可以通过

找出索引
[namesuq,i1,i2]=unique(names,'rows')

但在那之后,明显的电话

accumarray(i2,earning)

不工作。 当然可以在唯一名称或行上使用 for 循环,但这可能有点低效。有更好的想法吗?
另外我试过了

accumarray(i2,@(i)earnings(i,:))

但这没有实现并导致

使用 accumarray 时出错
第二个输入 VAL 必须是完整的数字、逻辑或字符向量或标量。

感谢您的想法。

补充:感谢eitan-t 的解决方案,这对示例非常有用。
太可悲了,我的最小工作示例并没有显示所有需求:我想要应用的函数需要一整行或稍后可能需要一个完整的 maxtrix,我需要将其分组到第三个甚至更高的维度。

也许更清楚一点:考虑一个大小为a x b x c 的矩阵Ma 中的每个条目对应一个名称左右。最好描述我的需求,例如总结所有唯一名称。
天真的编程会是

nam=unique(names);
for ind=1:size(nam,2)
    N(ind,:,:)=sum(M(nam(ind)==names,:,:),1);
end

这清楚吗?有解决办法吗?

【问题讨论】:

标签: matlab matrix grouping accumarray


【解决方案1】:

基于this answer,您正在寻找的解决方案是:

[namesuq, i1, i2] = unique(names, 'rows');
[c, r] = meshgrid(1:size(earnings, 2), i2);
y = accumarray([r(:), c(:)], earnings(:));

行与names(i1, :)匹配的位置。

示例

%// Sample input
names = str2mat('Tom', 'Sarah', 'Tom', 'Max', 'Max', 'Jon');
earnings = [100 200 20; 20 100 500; 1 5 900; 100 200 200; 200 200 0; 300 100 -250]

%// Sum along columns by names 
[namesuq, i1, i2] = unique(names, 'rows');
[c, r] = meshgrid(1:size(earnings, 2), i2);
y = accumarray([r(:), c(:)], earnings(:))

得到的总和是:

y =
   300   100  -250
   300   400   200
    20   100   500
   101   205   920

对应names(i1, :):

ans =
    Jon  
    Max  
    Sarah
    Tom  

【讨论】:

  • 感谢您的快速回答,很抱歉询问已回答的问题。此外,我有点太快了:是否还有机会获得 没有 缩放器索引?我有一个要应用的函数,它需要一整列(从示例中不清楚)。
  • 您的意思是要应用一组值的函数(例如,将其应用到 Tom 第一列中的[100; 1] 等...)?您能否更清楚地描述您期望获得的内容?
  • 嗨,Eitan,你还在看书吗?你有我的更新吗?建议?提前致谢。
  • @BastianEbeling 当然,我只是没有空闲时间重读。今天我会尽我最大的努力去实现它! :)
猜你喜欢
  • 1970-01-01
  • 2015-11-06
  • 1970-01-01
  • 2021-04-08
  • 2014-08-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多