矩阵算法的矩阵乘法/标量除法的问题[已关闭]

问题描述 投票:0回答:1

我正在执行一些矩阵运算,看看计算机如何处理它们。这就是我的矩阵乘法、转置和标量除法算法的样子:

#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 

我们在进行二阶运算时会失去精度。为什么会发生?我该如何解决它?

c++ algorithm math matrix-multiplication
1个回答
1
投票

int sum = 0;
更改为
long double sum = 0;

如果没有这个,临时单元积将四舍五入为 int,因此在您的代码中,许多 v+0.5 就变成了 v。

© www.soinside.com 2019 - 2024. All rights reserved.