题目
过程
矩阵点乘和叉乘
点乘:
叉乘:
思路
关键:通过改变计算顺序优化时间复杂度
通过先计算 而不是先计算
,有效地减少了计算时间,特别是在处理长序列时。这种优化通常在数据维度一不等时有显著效果,特别是当序列长度显著大于向量维度时。
部分推导
代码
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N=10010,D=30;
LL tmp[D][D],ans[N][N];
int n,d;
int Q[N][D],K[N][D],V[N][D],W[N];
int main()
{
cin>>n>>d;
for(int i=0;i<n;i++)
{
for(int j=0;j<d;j++)
{
cin>>Q[i][j];
}
}
for(int i=0;i<n;i++)
{
for(int j=0;j<d;j++)
{
cin>>K[i][j];
}
}
for(int i=0;i<n;i++)
{
for(int j=0;j<d;j++)
{
cin>>V[i][j];
}
}
for(int i=0;i<n;i++)cin>>W[i];
//计算K的转置*V=tmp
for(int i=0;i<d;i++)
{
for(int j=0;j<d;j++)
{
for(int k=0;k<n;k++)
tmp[i][j]+=K[k][i]*V[k][j];//注意这里矩阵转置的算法
}
}
//计算Q*tmp=ans
for(int i=0;i<n;i++)
{
for(int j=0;j<d;j++)
{
for(int k=0;k<d;k++)
ans[i][j]+=Q[i][k]*tmp[k][j];
ans[i][j]*=(LL)W[i];
}
}
for(int i=0;i<n;i++)
{
for(int j=0;j<d;j++)
cout<<ans[i][j]<<" ";
cout<<endl;
}
return 0;
}