Matrix summation rounding error?

5 vues (au cours des 30 derniers jours)
Giuseppe Gallo
Giuseppe Gallo le 23 Mai 2019
Modifié(e) : Stephen23 le 7 Fév 2025
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 commentaire
Stephen23
Stephen23 le 7 Fév 2025
Modifié(e) : Stephen23 le 7 Fév 2025
"... 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:

Connectez-vous pour commenter.

Réponses (1)

Harshavardhan
Harshavardhan le 7 Fév 2025
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.

Catégories

En savoir plus sur Matrix Indexing dans Help Center et File Exchange

Tags

Produits

Community Treasure Hunt

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

Start Hunting!

Translated by