在具有可变积分长度的二维数组上进行数值积分的有效方法

时间:2016-12-16 18:36:56

标签: arrays matlab numpy vectorization cumsum

我问了一个问题here关于在数字上集成一个固定长度的二维数组。现在如果整合长度不固定怎么办?对于每个单元格作为起点,我想保持积分,直到遇到具有相反符号值的单元格。因此,假设在从下到上的列中它是[1,2,5,4,-2,-3,2],如果我为第一个元素执行积分,它将整合前四个元素(它们都是正数)。如果我从第五个元素开始,它将只集成-2-3。有没有办法对它进行矢量化或加速,而不是使用双循环来首先找到每个单元格的积分长度,然后进行积分?

或简化问题只是整合积极因素: 例如:

data = [
-2, -1, 4, -2,-1;
1,  2,  3,  4, 5;
5, -4, -3,  2, 5;
3, -3, -9,  5, 7;
2, -2,  7, -5, 1;
2,  3,  1, -3, -3]

integrated_data = [
0,  0, 7,  0,  0;
13, 2, 3, 11, 18;
12, 0, 0   7, 13;
7,  0, 0,  5,  8;
4,  0, 8,  0,  1;
2,  3, 1,  0,  0]

1 个答案:

答案 0 :(得分:0)

MATLAB中的矢量化解决方案

data = [
-2, -1, 4, -2,-1;
1,  2,  3,  4, 5;
5, -4, -3,  2, 5;
3, -3, -9,  5, 7;
2, -2,  7, -5, 1;
2,  3,  1, -3, -3];
data1 = [-ones(1,size(data,2)) ;flipud(data)]
df = find([-1 ;diff((data1(:))>=0)] == 1)-1;
data1(data1<0) =0;
c1 = cumsum(data1(:));
data1(df) = data1(df) - [0 ;diff(c1(df))];
c2 = cumsum(data1(:));
c2(data1==0)=0;

c2=reshape(c2,size(data1));
result = flipud(c2(2:end,:))