Matrix summation rounding error?

4 次查看(过去 30 天)
Giuseppe Gallo
Giuseppe Gallo 2019-5-23
编辑: Stephen23 2025-2-7
Dear all,
I'm having trouble with summation of matrices and difference of the two sum. Here some lines of code:
thetaMN_prev = cellfun(@nansum, theta_prev);
cost_prev = sum(thetaMN_prev,'all');
thetaMN_try = cellfun(@nansum, theta_try);
cost_try = sum(thetaMN_try,'all');
cost_prev - cost_try often returns 0, while
sum(thetaMN_try - thetaMN_prev,'all') ~= 0, but this should be the same calculation mathematically speaking.
When this happens, cost_try and cost_prev are of the order of 1e19.
Is this an error due to some rounding process in function sum(A,'all')?
  1 个评论
Stephen23
Stephen23 2025-2-7
编辑:Stephen23 2025-2-7
"... this should be the same calculation mathematically speaking."
Sure, but computing with binary floating point numbers is not the same as mathematics that you learned at school.
In particular, floating point addition is not associative:

请先登录,再进行评论。

回答(1 个)

Harshavardhan
Harshavardhan 2025-2-7
The issue you're experiencing is likely due to floating-point precision errors. When dealing with very large numbers (e.g., 1e19), small differences can be lost due to rounding errors inherent in floating-point arithmetic. This can occur when subtracting two nearly equal large numbers, leading to a loss of precision.
We see this difference in results due to the order of operations:
  • Summing First, Then Subtracting:
cost_prev - cost_try
  • Here you're summing all elements of "thetaMN_prev" and "thetaMN_try" separately and then subtracting the two sums. This approach can amplify precision errors, because the subtraction of two large numbers can lead to significant cancellation error.
  • Subtracting Element-wise, Then Summing:
sum(thetaMN_try - thetaMN_prev, 'all')
  • Here you're subtracting corresponding elements of "thetaMN_try" and "thetaMN_prev first", and then summing the resulting differences. This method can be more accurate because it avoids the large intermediate sums and directly computes the overall difference, reducing the impact of floating-point precision errors.
I suggest using the second approach as its generally more accurate and can help minimize precision errors.
Hope this helps.

类别

Help CenterFile Exchange 中查找有关 Matrix Indexing 的更多信息

标签

产品

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by