Matlab数组求和函数sum的使用教程

今天,给大家带来Matlab中sum函数的使用教程,sum函数可以对一维数组求和,也可以对二维数组矩阵中的任意一行或任意一列求和,还可以对三维数组的任意一个维度生成的矩阵求和。最近,我讲的几篇,都可以在实际Matlab编程以及数据处理中用到。

本文主要讲解sum函数的常见用法、语法说明、向量元素的总和、矩阵列总和、矩阵行总和、数组切片总和、三维数组的总和、32 位整数之和、总和,不包括 NaN等用法。

下面,首先给出Matlab中关于sum函数的帮助文档如下:

>> help sum
 sum Sum of elements.
    S = sum(X) is the sum of the elements of the vector X. If X is a matrix,
    S is a row vector with the sum over each column. For N-D arrays, 
    sum(X) operates along the first non-singleton dimension.
 
    S = sum(X,DIM) sums along the dimension DIM. 
 
    S = sum(..., TYPE) specifies the type in which the 
    sum is performed, and the type of S. Available options are:
 
    'double'    -  S has class double for any input X
    'native'    -  S has the same class as X
    'default'   -  If X is floating point, that is double or single,
                   S has the same class as X. If X is not floating point, 
                   S has class double.
 
    S = sum(..., MISSING) specifies how NaN (Not-A-Number) values are 
    treated. The default is 'includenan':
 
    'includenan' - the sum of a vector containing NaN values is also NaN.
    'omitnan'    - the sum of a vector containing NaN values
                   is the sum of all its non-NaN elements. If all 
                   elements are NaN, the result is 0.
 
    Examples:
    If   X = [0 1 2; 3 4 5]
    then sum(X, 1) is [3 5 7] and sum(X, 2) is [3; 12]
 
    If X = int8(1:20) then sum(X) accumulates in double and the
    result is double(210) while sum(X,'native') accumulates in
    int8, but overflows and saturates to int8(127).

常见用法

S = sum(A)
S = sum(A,'all')
S = sum(A,dim)
S = sum(A,vecdim)
S = sum(___,outtype)
S = sum(___,nanflag)

语法说明

S = sum(A) 返回 A 沿大小不等于 1 的第一个数组维度的元素之和。

如果 A 是向量,则 sum(A) 返回元素之和。

如果 A 是矩阵,则 sum(A) 将返回包含每列总和的行向量。

如果 A 是多维数组,则 sum(A) 沿大小不等于 1 的第一个数组维度计算,并将这些元素视为向量。此维度会变为 1,而所有其他维度的大小保持不变。

S = sum(A,’all’) 计算 A 的所有元素的总和。此语法适用于 MATLAB® R2018b 及更高版本。

S = sum(A,dim) 沿维度 dim 返回总和。例如,如果 A 为矩阵,则 sum(A,2) 是包含每一行总和的列向量。

S = sum(A,vecdim) 根据向量 vecdim 中指定的维度对 A 的元素求和。例如,如果 A 是矩阵,则 sum(A,[1 2]) 是 A 中所有元素的总和,因为矩阵的每个元素包含在由维度 1 和 2 定义的数组切片中。

S = sum(_,outtype) 使用上述语法中的任何输入参数返回指定数据类型的总和。outtype 可以是 ‘default’、’double’ 或 ‘native’。

S = sum(_,nanflag) 指定在上述任意语法的计算中包括还是忽略 NaN 值。sum(A,’includenan’) 会在计算中包括所有 NaN 值,而 sum(A,’omitnan’) 则忽略这些值。

向量元素的总和

创建一个向量并计算各个元素的总和。

A = 1:10;
S = sum(A)

输出结果为:

S = 55

矩阵列总和

创建一个矩阵并计算每列中元素的总和。

A = [1 3 2; 4 2 5; 6 1 4]

得到如下矩阵:

A = 3×3

     1     3     2
     4     2     5
     6     1     4

S = sum(A)

事实上,我们也可以使用sum(A,1)来按列求和,上面的写法省略了1。如果把1改成2,就是按行求和,下面有给出例子。

求和结果如下:

S = 1×3

    11     6    11

矩阵行总和

创建一个矩阵并计算每行中元素的总和。

A = [1 3 2; 4 2 5; 6 1 4]

得到如下矩阵:

A = 3×3

     1     3     2
     4     2     5
     6     1     4

用如下表达式求每一行的和

S = sum(A,2)

得到如下结果:

S = 3×1

     6
    11
    11

关于Matlab使用sum函数求和,我之前写过一篇解决问题的文章,有所提到,可以参考下,更加深层次的了解sum函数的使用方法:《Matlab cell元胞数据读取方法实例讲解》。

数组切片总和

使用向量维度参数来操作数组的特定切片。这里,需要注意的是,Matlab需要2018以上,才支持这种切片求和方法。

创建所有元素为 1 的三维数组。

A = ones(4,3,2);

要对 A 的每个页面中的所有元素求和,请使用向量维度参数指定要求和的维度(行和列)。由于两个页面均为 4×3 矩阵,因此每页的总和为 12。

S1 = sum(A,[1 2])

以上写法表示将矩阵的第一个维度和第二个维度生成的矩阵进行分别求和,因此会得到两个求和结果:

S1 = 
S1(:,:,1) =

    12


S1(:,:,2) =

    12

如果沿第一个维度对 A 进行切片,则可以对得到的 4 个页面的元素求和,每个页面为 3×2 矩阵。

S2 = sum(A,[2 3])

以上写法表示将矩阵的第二个维度和第三个维度生成的矩阵进行分别求和,因此会得到四个求和结果:这是因为第一个维度上有4个数字,即三维矩阵是4*3*2的。

S2 = 4×1

     6
     6
     6
     6

沿第二个维度切片,每个页面总和超过 4×2 矩阵。

S3 = sum(A,[1 3])

以上写法表示将矩阵的第一个维度和第三个维度生成的矩阵进行分别求和,因此会得到三个求和结果:

S3 = 1×3

     8     8     8

从 R2018b 开始,要对数组的所有维度求和,可以在向量维度参数中指定每个维度,或使用 ‘all’ 选项。

S4 = sum(A,[1 2 3])
S4 = 24
Sall = sum(A,'all')
Sall = 24

以上表示,可以用all,代替表示所有维度,不过需要Matlab R2018b版本以上才可以。

前文中,出现了切片求和中一些2016版本尚不支持的写法,下面给出更加合适的写法:

sum(sum(A,1),3)
sum(sum(A,1),2)
sum(sum(A,2),3)

得到如下结果:

ans(:,:,1) =

    12


ans(:,:,2) =

    12


ans =

     6
     6
     6
     6


ans =

     8     8     8

这种,就涉及到了sum函数的嵌套,或许你需要仔细思考下才可以理解其中的道理。但这种写法得到的结果跟前面的切片求和部分,对三维数组的各个维度求和的结果是一致的。

如果你还是不理解,可以再看看下面拆开的写法运算结果:

>> sum(A,1)

ans(:,:,1) =

     4     4     4


ans(:,:,2) =

     4     4     4

>> sum(A,2)

ans(:,:,1) =

     3
     3
     3
     3


ans(:,:,2) =

     3
     3
     3
     3

>> sum(A,3)

ans =

     2     2     2
     2     2     2
     2     2     2
     2     2     2

以上后半部分所要到的A,都是在切片求和部分生成的三维全1矩阵。

    © 版权声明
    THE END
    喜欢就支持一下吧
    点赞2分享
    评论 抢沙发

    请登录后发表评论

      暂无评论内容