c++ 如何将矩阵乘法的结果(使用返回数组的自定义函数)存储在不同的数组中(得到左值错误)?

0yg35tkg  于 2022-11-27  发布在  其他
关注(0)|答案(2)|浏览(137)

我试着把两个矩阵相乘,我必须做很多次乘法,所以我创建了一个函数

float multiply_,matrix(float mat_1[R][C1], float mat_2[R][C2])

这个函数返回一个数组,我想把它存储在main中声明的数组中。
不可修改的左值
如何将函数的结果存储在不同的数组中?
功能:

float multiply_matrix(float mat_1[N][R1], float mat_2[N][R2]){
    float temp[N][C2]; // temporary matrix
    for (int i = 0; i < N; i++){
        for (int j = 0; j < R2; j++){   //since stress matrix has only one column
            temp[i][j] = 0;
            for (int a = 0; a < N; a++){ //N here is the number of rows of the 2nd matrix
                temp[i][j] += mat_1[i][a]*mat_2[a][j];
            }
        }     
    }
    return temp[N][C2];
}

我尝试在main函数中存储值的方式:

float stress_12[N][R2];
stress_12 = multiple_matrix(T,stress_12);

我希望直接存储数组,但出现错误
表达式必须是左值
我确实理解了here中的左值错误是什么,但是我想不出存储函数结果的方法。

lrl1mhuk

lrl1mhuk1#

首先,当声明multiply_matrix函数时,你的参数不能是mat_1[N][R1]和mat_2[N][R2],因为N,R1和R2都没有定义(这些数组的大小是动态的,这是c++不允许的,因此你需要创建一个指向数组的指针,如下所示:(一个月一个月)
假设您要对N进行硬编码,则应该如下声明temp:

std::vector<std::vector<float> > temp(N, std::vector<float>(C2))

相反,您应该使用std::vector,它是一个动态调整大小的数组,因此您的函数看起来如下所示:

#include <vector>
    //std::vector<std::<vector<float> > is just a vector of vector or a 2 dimensional array of floats
    std::vector<std::vector<float> > multiply_matrix(std::vector<std::vector<float> > mat_1, std::vector<std::vector<float> > mat_2){
    //your code here
    }

你的函数也返回一个浮点数(意味着一个浮点数,而不是一个数组),所以返回类型应该是vector〈vector〉(一个动态的浮点数组)
最后,尝试返回temp[N][C2],它不是数组,而是浮点数(第N-1行,第C2- 1列),stress_12是数组(也应该是向量)。
希望这对你有帮助。

lrpiutwd

lrpiutwd2#

问题中的代码有多个问题。我将假设矩阵维数NR1R2C2在编译时已知。如果不是这样,则应在问题中说明。我将替换表单中的所有问题

float matrix[M][N]

Matrix<M, N> matrix

其中Matrix被定义为

#include <array>

template <std::size_t M, std::size_t N>
using Matrix = std::array<std::array<float, N>, M>;

这样做的好处是,你可以复制你的矩阵,将它作为一个函数的值返回,等等。换句话说,它的工作方式就像任何其他值一样,无论是结构体还是int
函数multiply_matrix中存在一些矩阵维数不兼容的问题。我将把该函数作为模板函数重新实现,其中矩阵维数是编译时参数。请注意,我更正了mat_1mat_2的维数,使mat_1的列数与mat_2的行数相同,结果矩阵的行数与mat_1的行数相同和mat_2一样多的列。任何传递维数不兼容的矩阵的尝试都将在编译时被捕获:

template <std::size_t M, std::size_t K, std::size_t N>
Matrix<M, N> multiply_matrix(
  const Matrix<M, K>& mat_1, const Matrix<K, N>& mat_2) {
    Matrix<M, N> temp;
    for (int i = 0; i < M; i++){
        for (int j = 0; j < N; j++) {
            temp[i][j] = 0;
            for (int a = 0; a < K; a++) {
                temp[i][j] += mat_1[i][a]*mat_2[a][j];
            }
        }     
    }
    return temp;
}

另请注意,最后一行是return temp;,而不是return temp[N][C2];
那我就可以这样用了......

Matrix<3, 3> T /* = ... */;
Matrix<3, 2> stress_12 /* = ... */;
stress_12 = multiply_matrix(T, stress_12);

如果你打算做很多矩阵数学,你可能要考虑使用一个好的矩阵库,比如Eigen,而不是重新发明你自己的东西。

相关问题