我正在执行一些矩阵运算,看看计算机如何处理它们。这就是我的矩阵乘法、转置和标量除法算法的样子:
#include <iostream>
#include <vector>
using namespace std;
vector<vector<long double>> trans(vector<vector<long double>> A){
int columns = A[0].size();
int rows = A.size();
vector<vector<long double>> B = {};
vector<long double> sample = {};
for(int i = 1;i<=columns;i++){
sample.clear();
for(int j=1;j<=rows;j++){
sample.push_back(A[j-1][i-1]);
}
B.push_back(sample);
}
return B;
}
vector<vector<long double>> multiply(vector<vector<long double>> A,vector<vector<long double>> B){
int sum = 0;
vector<vector<long double>> transed_one = trans(B);
vector<vector<long double>> C = {};
vector<long double> sample = {};
for(vector<long double> &i : A){
sample.clear();
for(vector<long double> &j : transed_one){
sum = 0;
for(int k =1;k<=i.size();k++){
sum += i[k-1]*j[k-1];
}
sample.push_back(sum);
}
C.push_back(sample);
}
return C;
}
string std_output(vector<vector<long double>> A){
string output = "\n";
for(int i = 1;i<=A.size();i++){
for(int j = 1;j<=A[0].size();j++){
output = output+to_string(A[i-1][j-1])+=" ";
}
output += "\n";
}
return output;
}
vector<vector<long double>> divide(vector<vector<long double>> A,long double scalar){
vector<vector<long double>> B = {};
vector<long double> sample = {};
for(vector<long double> &i: A){
sample.clear();
for(long double &j: i){
sample.push_back(j/scalar);
}
B.push_back(sample);
}
return B;
}
int main(){
vector<vector<long double>> A = {{1,2},{3,4}};
vector<vector<long double>> B = {{5,6},{7,8}};
cout<<"Result 1:";
cout<<std_output(divide(multiply(A,B),2));//division using a scalar after multiplication of a and b
cout<<"Result 2:";
cout<<std_output(multiply(divide(A,2),B));//multiplication after division using a scalar
}
两者预计会给出相同的输出,但是。我得到的输出是:
Result 1:
9.500000 11.000000
21.500000 25.000000
Result 2:
9.000000 11.000000
21.000000 25.000000
我们在进行二阶运算时会失去精度。为什么会发生?我该如何解决它?
将
int sum = 0;
更改为 long double sum = 0;
。
如果没有这个,临时单元积将四舍五入为 int,因此在您的代码中,许多 v+0.5 就变成了 v。