【问题标题】:Efficient way of doing numerical integration on a 2d array with variable integration length对具有可变积分长度的二维数组进行数值积分的有效方法
【发布时间】:2017-05-02 14:39:54
【问题描述】:

我问了一个问题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]

【问题讨论】:

  • 请添加一个示例,例如一个 [5 , 5] 矩阵和预期输出。
  • 你问的是 Matlab 还是 NumPy?
  • 为什么integrated_data的左上角有个0?不应该是-2吗?
  • 您的“集成数据”示例看起来像应用np.maximum(array, 0),然后使用cumsum

标签: arrays matlab numpy vectorization cumsum


【解决方案1】:

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,:))

【讨论】:

    猜你喜欢
    • 2016-12-13
    • 2014-11-28
    • 2020-10-02
    • 2021-02-21
    • 2019-11-15
    • 2019-11-22
    • 2020-11-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多