我对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 - 但我的窗口大小有问题,并且总和是重叠的。
有没有人知道如何在不使用循环的情况下实现它?
提前致谢并致以最诚挚的问候 斯蒂芬
答案 0 :(得分:4)
这似乎有效:
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