我试着把两个矩阵相乘,我必须做很多次乘法,所以我创建了一个函数
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中的左值错误是什么,但是我想不出存储函数结果的方法。
2条答案
按热度按时间lrl1mhuk1#
首先,当声明multiply_matrix函数时,你的参数不能是mat_1[N][R1]和mat_2[N][R2],因为N,R1和R2都没有定义(这些数组的大小是动态的,这是c++不允许的,因此你需要创建一个指向数组的指针,如下所示:(一个月一个月)
假设您要对N进行硬编码,则应该如下声明temp:
相反,您应该使用std::vector,它是一个动态调整大小的数组,因此您的函数看起来如下所示:
你的函数也返回一个浮点数(意味着一个浮点数,而不是一个数组),所以返回类型应该是vector〈vector〉(一个动态的浮点数组)
最后,尝试返回temp[N][C2],它不是数组,而是浮点数(第N-1行,第C2- 1列),stress_12是数组(也应该是向量)。
希望这对你有帮助。
lrpiutwd2#
问题中的代码有多个问题。我将假设矩阵维数
N
、R1
、R2
、C2
在编译时已知。如果不是这样,则应在问题中说明。我将替换表单中的所有问题由
其中
Matrix
被定义为这样做的好处是,你可以复制你的矩阵,将它作为一个函数的值返回,等等。换句话说,它的工作方式就像任何其他值一样,无论是结构体还是
int
。函数
multiply_matrix
中存在一些矩阵维数不兼容的问题。我将把该函数作为模板函数重新实现,其中矩阵维数是编译时参数。请注意,我更正了mat_1
和mat_2
的维数,使mat_1
的列数与mat_2
的行数相同,结果矩阵的行数与mat_1
的行数相同和mat_2
一样多的列。任何传递维数不兼容的矩阵的尝试都将在编译时被捕获:另请注意,最后一行是
return temp;
,而不是return temp[N][C2];
。那我就可以这样用了......
如果你打算做很多矩阵数学,你可能要考虑使用一个好的矩阵库,比如Eigen,而不是重新发明你自己的东西。