1. Overview
Matrix multiplication is an important operation in mathematics. It is a basic linear algebra tool and has a wide range of applications in several domains like physics, engineering, and economics.
In this tutorial, we’ll discuss two popular matrix multiplication algorithms: the naive matrix multiplication and the Solvay Strassen algorithm. We’ll also present the time complexity analysis of each algorithm.
2. Introduction to Matrix Multiplication
We’re taking two matrices and of order and . Let’s take a look at the matrices:
,
Now when we multiply the matrix by the matrix , we get another matrix – let’s name it . The order of the matrix would be .
Let’s now look into elements the matrix :
.
Each entries in the matrix can be calculated from the entries of the matrix and by finding pairwise summation:
3. Matrix Multiplication Properties
Let , and be three matrices of the same dimensions.
According to the associative property in multiplication, we can write . This property states that we can change the grouping surrounding matrix multiplication, and it’ll not affect the output of the matrix multiplication.
We can distribute the matrices in a similar way we distribute the real numbers. Using distributive property in multiplication we can write: .
There are some special matrices called an identity matrix or unit matrix which has in the main diagonal and elsewhere. Some examples of identity matrices are:
, ,
There is a very interesting property in matrix multiplication. When a matrix is multiplied on the right by a identity matrix, the output matrix would be same as matrix. This property is called multiplicative identity. For example:
It is important to note that matrix multiplication is not commutative. Suppose we multiply two matrices and of the same order then . This is the general case. But if and both are diagonal matrix and have the same dimensions, they hold the commutative property.
4. The Naive Matrix Multiplication Algorithm
Let’s see the pseudocode of the naive matrix multiplication algorithm first, then we’ll discuss the steps of the algorithm:
algorithm NaiveMatrixMultiplication(S, P, A, B, G, H):
// INPUT
// S = Matrix of size AxB
// P = Matrix of size GxH
// OUTPUT
// Q = The matrix product of S and P
if B = G:
Q <- make a new matrix of size AxH
for m <- 0 to A - 1:
for r <- 0 to H - 1:
Q[m, r] <- 0
for k <- 0 to G - 1:
Q[m, r] = Q[m, r] + S[m, k] * P[k, r]
return Q
else:
return "Incompatible dimensions"
The algorithm loops through all entries of and , and the outermost loop fills the resultant matrix .
To find an implementation of it, we can visit our article on Matrix Multiplication in Java.
4.2. Time Complexity Analysis
The naive matrix multiplication algorithm contains three nested loops. For each iteration of the outer loop, the total number of the runs in the inner loops would be equivalent to the length of the matrix. Here, integer operations take time. In general, if the length of the matrix is , the total time complexity would be .
Now the question is, can we improve the time complexity of the matrix multiplication? We’ll discuss an improved matrix multiplication algorithm in the next section.
5. The Solvay Strassen Algorithm
5.1. Algorithm
In the year 1969, Volker Strassen made remarkable progress, proving the complexity was not optimal by releasing a new algorithm, named after him.
Where the naive method takes an exhaustive approach, the Stassen algorithm uses a divide-and-conquer strategy along with a nice math trick to solve the matrix multiplication problem with low computation.
Let’s take two input matrices and of order . In general, the dimension of the input matrices would be :
,
First step is to divide each input matrix into four submatrices of order :
Next step is to perform 10 addition/subtraction operations:
The third step of the algorithm is to calculate 7 multiplication operations recursively using the previous results. Here each is of size :
Finally, the desired submatrices of the resultant matrix can be calculated by adding and subtracting various combinations of the submatrices:
Now let’s put everything together in matrix form:
So as we can see, this algorithm needs to perform multiplication operations, unlike the naive algorithm, which needs multiplication operations.
It is important to note that this algorithm works only on square matrices with the same dimensions.
5.2. Time Complexity Analysis
This solution is based on recursion. In the first step, we divide the input matrices into submatrices of size . This step can be performed in times.
In step , we calculate addition/subtraction operations which takes time.
In step , we make recursive calls to calculate to . The output of this step would be matrix of order . This step takes time.
Finally, by adding and subtracting submatrices of , we get our resultant matrix . The time complexity of this step would be .
Therefore the total time complexity of this algorithm would be:
6. Comparison Between Two Algorithms
Let’s summarize two matrix multiplication algorithms in this section and let’s put the key points in a table:
Parameter
The Naive Algorithm
The Solvay Strassen Algorithm
Time Complexity
Approach
Iterative
Divide-and-conquer
Application
Square as well as non-square matrices
Suitable for square matrices only
7. Conclusion
In this tutorial, we’ve discussed two algorithms for matrix multiplication: the naive method and the Solvay Strassen algorithm in detail.
We also presented a comparison including the key points of these two algorithms.