由于看到 了动态规划来分析解决矩阵链乘的问题,所以回顾了一下矩阵乘法,发现这个知识点忘记的差不多了,现在再来总结一下。
首先我们知道两个矩阵相乘A*B,那么A的列数必须等于B的行数,否则不能进行相乘.
首先我们来回顾一下解决矩阵相乘问题的一般方法:利用三个for循环来解决,时间复杂度为o(n^3)。
矩阵乘法定义:
例如有两个n乘以n的矩阵A和B,C=A*B;
那么求C的过程为:
#include<iostream>
using namespace std;
int main()
{
int a[3][4] = {
1, 3, 3, 1,
1, 2, 4, 1,
2, 6, 5, 1
};
int b[4][2] = {
2, 1,
2, 1,
2, 1,
2, 1
};
int c[3][2] = { 0 };
for (int i = 0; i < 3; ++i)
{
for (int j = 0; j < 2; ++j)
{
c[i][j] = 0;
for (int k = 0; k < 4; ++k)
c[i][j] = c[i][j] + a[i][k] * b[k][j];
}
}
for (int i = 0; i < 3; ++i)
{
int k = 0;
for (int j = 0; j < 2; ++j)
{
cout << c[i][j] << " ";
k++;
if (k == 2)
{
cout << endl;
}
}
}
return 0;
}
现在我们来看看Strassen算法的原理:
一般情况下矩阵乘法需要三个for循环,时间复杂度为O(n^3),现在我们将矩阵分块如图:( 来自MIT算法导论 )