快速获取数列/矩阵中前项元素累积和

如果我们有数列 a ,希望生成数列b,其中数列 b 中任意一项b[i]具有一下:

bi=j=1iaj

最简单直接的实现方法是使用 for 循环得到:

a = [ 1 2 3 4 5];
b = zeros(1,length(a));

b(1) = a(1);
for i = 2:length(a)
    b(i) = b(i-1) + a(i);
end
%b = [1 3 6 10 15]

更好的方式是使用矩阵来进行计算,如果我们有如下三角矩阵:

triMx=1000011000111001111011111

那么,下述矩阵乘法即可立即得到结果。
b=atriMx

a = [ 1 2 3 4 5];
mxl = size(a,2);                %得到行向量的数目
triMx = triu(ones(mxl,mxl),0);  %构造上三角矩阵
b = a*triMx;
%b = [1 3 6 10 15]

事实上,我们可以讲 a 扩展成为一个矩阵,上三角矩阵triMx仍然可以对每一行进行求解。

a = [ 1 2 3 4 5;  
      2 3 4 5 6];
mxl = size(a,2);               %得到行向量的数目
triMx = triu(ones(mxl,mxl),0); %构造上三角矩阵
b = a*triMx;                   %注意三角矩阵的位置
%b = 1     3     6    10    15
%    2     5     9    14    20

不难发现,如果我们需要对矩阵的列方向进行相同的任意前向元素求和,可以继续使用下三角矩阵:

b = [1     3     6    10    15
     2     5     9    14    20]
mxl = size(b,1);               %得到列向量的数目
triMx = tril(ones(mxl,mxl),0); %构造下三角矩阵
c = triMx*b                    %注意三角矩阵的位置
%c =
%     1     3     6    10    15
%     3     8    15    24    35

更进一步的,如果我们需要得到一幅图像的积分图,我们可以先求得列向量的累积和,然后对计算结果再求行向量的累积和:

b = [1     3     6    10    15
     2     5     9    14    20]

mxl = size(b,1);                %得到列向量的数目
triMx = tril(ones(mxl,mxl),0);  %构造下三角矩阵
c = triMx*b

mxl = size(c,2);                %得到行向量的数目
triMx = triu(ones(mxl,mxl),0);  %构造上三角矩阵
d = c*triMx                     

%使用matlab内建的函数cumsum,首先对列,然后对行进行累积和计算,得到的结果是一致的
t = cumsum(cumsum(b,1),2)

事实上,Matlab内建了用于计算积分图像的函数integralImage

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页