矩阵的相乘
瞎吹吹
由m行、n列的标量所构成的数组被称为一个
m
×
n
m×n
m×n的矩阵
(
m
a
t
r
i
x
)
(matrix)
(matrix)。一般用大写字母表示矩阵,对应的小写字母表示矩阵中的项
(
e
n
t
r
y
)
(entry)
(entry)。这里,aij就是矩阵A中第i行第j列的项。
定义矩阵
A
,
B
A,B
A,B。A和B可以作乘法操作当且仅当A的大小是
a
×
b
a×b
a×b,B的大小是
b
×
c
b×c
b×c,其中
a
,
b
,
c
a,b, c
a,b,c皆为正整数。设矩阵
C
=
A
B
C=AB
C=AB,则C的大小是
a
×
c
a×c
a×c,且有
矩阵乘法满足结合律,但不满足交换律,具体证明略。
瞎打打
常规写法一:
matrix multi(matrix a,matrix b)
{
matrix c;
c.n=a.n,c.m=b.m; //乘法后的矩阵的行数与一个矩阵相同,列数与第二个矩阵相同
for (int i=1;i<=c.n;i++) //初始化
{
for (int j=1;j<=c.m;j++) c.a[i][j]=0;
}
for (int k=1;k<=a.m;k++) //先枚举中间的数,时间上比较优秀,按k,i,j的顺序依次枚举
{
for (int i=1;i<=a.n;i++)
{
for (int j=1;j<=b.m;j++)
{
c.a[i][j]+=a.a[i][k]*b.a[k][j];
}
}
}
return c;
}
常规写法二:
struct matrix{
int n,m;
LL a[30][30];
}A,B; //定义一个矩阵类型,表示矩阵的行,列和元素
matrix operator *(matrix a,matrix b) //定义矩阵类之间的乘法
{
matrix c;
c.n=a.n,c.m=b.m; //行和列进行赋值
for (int i=0;i<=c.n;i++)
{
for (int j=0;j<=c.m;j++) c.a[i][j]=0; //清空数组
}
for (int k=1;k<=a.m;k++) //计算矩阵乘法
{
for (int i=1;i<=a.n;i++)
{
for (int j=1;j<=b.m;j++)
{
c.a[i][j]=(c.a[i][j]+a.a[i][k]*b.a[k][j]%mod)%mod; //这是取mod意义下的计算方式
}
}
}
return c; //返回结果
}
矩阵转置
矩阵乘法的快速幂
定义矩阵M,M的大小为
N
×
N
N×N
N×N,t个矩阵M相乘记为MT
因为矩阵乘法满足结合律,所以可以用快速幂在 O(N3log t) 的时间内求出
过程如下:
代码
void power(LL k) //计算A^k,并存在数组B中
{
if (k==1)
{
B=A;
return;
}
power(k/2); //计算A^(k/2)
B=B*B; //直接用乘号即可调用上述过程,对A^(k/2)平方
if (k&1) B=B*A; //如果是奇数,在乘上一个A
}