一、前言
matlab中计算数据的和有2种方式,一是“循环配合加法”计算,二是通过sum()来计算。
二、问题和原因
最近我需要在matlab中计算一个33696000行的列向量的和,发现通过前言中所述的两种方式求得的和结果不一样。经过一番搜索后发现:在MATLAB中,对大型列向量使用+运算符手动求和与内置的sum
函数结果不一致的原因通常与浮点数精度误差和求和算法差异有关。具体原因可能如下:
-
浮点数精度限制
(1)计算机使用有限位数(如双精度约16位十进制)表示浮点数。当累加大量元素时,舍入误差会累积,尤其是元素数量级差异较大时。(2)手动循环累加(s = s + v(i)
)可能因顺序相加导致更大的误差,而sum
函数内部使用成对求和(Pairwise Summation)算法,将误差从 O(n)O(n) 降至 O(logn)O(logn),结果更精确。 -
数据类型问题
若向量为单精度(single
),手动累加时可能无意中转为双精度(double
),而sum
返回单精度结果,导致差异。 -
特殊值干扰
若向量包含NaN
或Inf
,sum
会直接返回NaN
或Inf
,而手动累加若未正确处理这些值,结果会不同。
因为我的向量中不包含NaN或Inf,所以应该是原因1和2更可能些,于是我尝试将向量转为双精度,之后发现2种方法所计算的和结果相差不大。
三、解决
大批量数据求和还是优先使用sum()吧,一点点差异也能接受。
注:以上内容为日常学习记录,如侵则删。