重点
1.矩阵的转置
2.矩阵相乘(注意乘完后的m*n的m和n的值)
3.空间优化(最关键)(实际就是不储存数,直接将数连续算,求出结果直接输出(结果导向型))
将二维降为一维
#include<iostream>
using namespace std;
int W[10002] = { 0 }, Q[10002][21] = { 0 }, K[10002][22] = { 0 }, K1[22][10002] = { 0 },
V[10001][22] = { 0 };
long long M[10001];
int n, d;
void reverse()//矩阵转置
{
for (int i = 1;i <= n;i++)
{
for (int j = 1;j <= d;j++)
{
K1[j][i] = K[i][j];
}
}
}
int main()
{
cin >> n >> d;
for (int i = 1;i <= n;i++)
{
for (int j = 1;j <= d;j++)
cin >> Q[i][j];
}
for (int i = 1;i <= n;i++)
{
for (int j = 1;j <= d;j++)
cin >> K[i][j];
}
for (int i = 1;i <= n;i++)
{
for (int j = 1;j <= d;j++)
cin >> V[i][j];
}
for (int i = 1;i <= n;i++)
{
cin >> W[i];
}
reverse();
for (int i = 1;i <= n;i++)
{//{矩阵相乘
for (int j = 1;j <= n;j++)
{
M[j] = 0;
for (int z = 1;z <= d;z++)
{
M[j] += Q[i][z] * K1[z][j];
}//矩阵相乘}
M[j] *= W[i];
}
for (int j = 1;j <= d;j++)
{
long long temp = 0;
for (int k = 1;k <= n;k++)
{
temp += M[k] * V[k][j];
}
if (j == 1)
cout << temp;
else
cout << ' ' << temp;
}
cout << endl;
}
return 0;
}