【问题标题】:Summing data by window size in grouped data在分组数据中按窗口大小对数据求和
【发布时间】:2014-10-31 16:32:35
【问题描述】:

我对 matlab 很陌生,我正在尝试找到一种方法来完成以下任务,而不使用 for 循环:

我有一个如下所示的数据集:

data = [1 5; 1 3; 1 8; 2 1; 2 2; 2 5; 3 3; 3 8; 3 4]

第一列是一个组(是未来的月年组合)

现在我想计算具有给定窗口大小的第二列的总和,但前提是组索引相同 - 如果不是,则应计算该组中的最大总和。

如果窗口大小=2,我想创建以下结果:

summed_data = [1 8; 1 11; 1 8; 2 3; 2 7; 2 5; 3 11; 3 12; 3 4]

窗口大小为 3 时,结果如下所示:

summed_data = [1 16; 1 11; 1 8; 2 8; 2 7; 2 5; 3 15; 3 12; 3 4]

等等。

我曾考虑通过创建足够的子索引来使用 accumarray - 但我遇到了窗口大小问题并且总和重叠。

有没有人知道如何在不使用循环的情况下实现它?

提前致谢并致以最诚挚的问候 斯蒂芬

【问题讨论】:

  • 在第一列中,1s2s3s 各有三个。总是这样吗?即所有标签的标签数量总是相同的?
  • 你好 Divakar,不,这只是(坏例子)案例。

标签: matlab accumarray


【解决方案1】:

这似乎有效:

ws = 2; k = [ones(ws,1);zeros(mod(ws,2),1)];
C = accumarray(data(:,1),data(:,2),[],@(v){conv(v,k,'same')})

您似乎锚定到窗口中的当前像素并向前看。对吗?

不确定这是否涵盖所有极端情况,但它可能会引导您朝着正确的方向前进。

测试:ws = 2

ws = 2; k = [ones(ws,1);zeros(mod(ws,2),1)];
C = accumarray(data(:,1),data(:,2),[],@(v){conv(v,k,'same')});
summed_data = [data(:,1) vertcat(C{:})]
summed_data =

     1     8
     1    11
     1     8
     2     3
     2     7
     2     5
     3    11
     3    12
     3     4

测试:ws = 3

summed_data = [data(:,1) vertcat(C{:})]
summed_data =

     1    16
     1    11
     1     8
     2     8
     2     7
     2     5
     3    15
     3    12
     3     4

【讨论】:

  • 不确定这会有多有效,但似乎确实有效!至少是一个干净的解决方案。
  • @Divakar 对于更大的窗口大小可能会崩溃,但我不完全理解意图以及如何以 OP 想要的方式锚定窗口总和。
  • @Divakar 是的,我不确定正确的结果应该是什么。 accumarray 调用的函数可能需要调整并填充内核,具体取决于所需的行为。
  • 这也是我的第一个方法+1
  • 工作起来就像一个魅力 - 感谢方便的解决方案和展示 accumarray 的力量!
猜你喜欢
  • 1970-01-01
  • 2015-06-29
  • 2013-04-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-01
相关资源
最近更新 更多