Matrix multiplication gives different result than manual dot products with each column

1 visualizzazione (ultimi 30 giorni)
Andrew il 2 Mar 2023
Commentato: Andrew il 2 Mar 2023
N = 1000;
B = 10;
C = 2;
x = randn(N,B);
b = randn(B,C);
matMult = x * b;
dotProd = [x*b(:,1), x*b(:,2)];
isequal(matMult, dotProd) %==0
mean(matMult(:) - dotProd(:)) % approaches 0
Does anyone know why these two expressions don't give the same answer?
2 CommentiMostra NessunoNascondi Nessuno
Stephen23 il 2 Mar 2023
Andrew il 2 Mar 2023
Thank you!

Accedi per commentare.

Risposta accettata

Bruno Luong il 2 Mar 2023
"Does anyone know why these two expressions don't give the same answer? "
Why should they? The algorithm can perform diffrent sum orders, different accumulation scheme, different thread numbers. One should not expect they to be exactly equal.
2 CommentiMostra NessunoNascondi Nessuno
Andrew il 2 Mar 2023
From a person with thorough knowledge of linear algebra but minimal computer science, one would expect them to be identical because the two expressions (matMult & dotProd) request the same mathematical operation. Your list of algorithmic differences is what I was looking for to understand the computer science behind the differences.
Bruno Luong il 2 Mar 2023
Modificato: Bruno Luong il 2 Mar 2023
When one works with numerical calculation on computer, one should be awared about the imperfect of finite precision aritmetics (round off error, non associativity, non commutivity, ...).
The "*" MATLAB operation is performed by Blas and Lapack library and can be differently implemented by platform and version. They are not documented by TMW because they reserved the freedom to change it (and they did serveral times in the pass).
The proof is that your code returns identical result on Linux machine R2022b (see @KSSV answer), but not on Windows (for example my laptop or your computer). It can also change with HW such as the number of cores of the CPU.
Bottomline is that use should not numerical calculation of the same mathematical expression returns the exact same answer if they call different function calls to achieve the same expression.

Accedi per commentare.

Più risposte (1)

KSSV il 2 Mar 2023
As you are comparing floatting point number, you should not use isequal. You should proceed like shown below:
N = 1000;
B = 10;
C = 2;
x = randn(N,B);
b = randn(B,C);
matMult = x * b;
dotProd = [x*b(:,1), x*b(:,2)];
tol = 10^-5 ; % can be changed
all(abs(matMult-dotProd)<tol,'all')
ans = logical
1
0 CommentiMostra -2 commenti meno recentiNascondi -2 commenti meno recenti

Accedi per commentare.

Categorie

Scopri di più su Time Series Collections in Help Center e File Exchange

R2022b

Community Treasure Hunt

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

Start Hunting!

Translated by