我问了一个问题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]
答案 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,:))