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

来源:互联网 发布:剑三同人知乎 编辑:程序博客网 时间:2024/05/19 06:47

如果我们有数列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*bmxl = size(c,2);                %得到行向量的数目triMx = triu(ones(mxl,mxl),0);  %构造上三角矩阵d = c*triMx                     %使用matlab内建的函数cumsum,首先对列,然后对行进行累积和计算,得到的结果是一致的t = cumsum(cumsum(b,1),2)

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

0 0
原创粉丝点击