【发布时间】:2021-10-25 18:41:09
【问题描述】:
我正在尝试进行大型矩阵乘法,例如1000x1000。不幸的是,它只适用于非常小的矩阵。对于大的,程序只是打开,仅此而已 - 没有结果。代码如下:
#include <iostream>
using namespace std;
int main() {
int matrix_1_row;
int matrix_1_column;
matrix_1_row = 10;
matrix_1_column = 10;
int** array_1 = new int* [matrix_1_row];
// dynamically allocate memory of size matrix_1_column for each row
for (int i = 0; i < matrix_1_row; i++)
{
array_1[i] = new int[matrix_1_column];
}
// assign values to allocated memory
for (int i = 0; i < matrix_1_row; i++)
{
for (int j = 0; j < matrix_1_column; j++)
{
array_1[i][j] = 3;
}
}
int matrix_2_row;
int matrix_2_column;
matrix_2_row = 10;
matrix_2_column = 10;
// dynamically create array of pointers of size matrix_2_row
int** array_2 = new int* [matrix_2_row];
// dynamically allocate memory of size matrix_2_column for each row
for (int i = 0; i < matrix_2_row; i++)
{
array_2[i] = new int[matrix_2_column];
}
// assign values to allocated memory
for (int i = 0; i < matrix_2_row; i++)
{
for (int j = 0; j < matrix_2_column; j++)
{
array_2[i][j] = 2;
}
}
// Result
int result_row = matrix_1_row;
int result_column = matrix_2_column;
// dynamically create array of pointers of size result_row
int** array_3 = new int* [result_row];
// dynamically allocate memory of size result_column for each row
for (int i = 0; i < result_row; i++)
{
array_3[i] = new int[result_column];
}
// Matrix multiplication
for (int i = 0; i < matrix_1_row; i++)
{
for (int j = 0; j < matrix_2_column; j++)
{
array_3[i][j] = 0;
for (int k = 0; k < matrix_1_column; k++)
{
array_3[i][j] += array_1[i][k] * array_2[k][j];
}
}
}
//RESULTS
for (int i = 0; i < result_row; i++)
{
for (int j = 0; j < result_column; j++)
{
std::cout << array_3[i][j] << "\t";
}
}
// deallocate memory using delete[] operator 1st matrix
for (int i = 0; i < matrix_1_row; i++)
{
delete[] array_1[i];
}
delete[] array_1;
// deallocate memory using delete[] operator 2nd matrix
for (int i = 0; i < matrix_2_row; i++)
{
delete[] array_2[i];
}
delete[] array_2;
// deallocate memory using delete[] operator result
for (int i = 0; i < result_row; i++)
{
delete[] array_3[i];
}
delete[] array_3;
return 0;
}
有人知道如何解决吗?我在什么时候出错了?我使用了指针,动态内存分配。
【问题讨论】:
-
您可以将数据存储在
std::vector<std::vector<double>>中,而不是手动分配/删除内存。 -
首先:将所有这些包装在一个类中,这样您就不必手动调用
delete[]。其次,矩阵应该只对整个数据使用单个分配,然后进行数学计算来计算索引(同样,隐藏在类中)。第三,对于具体的矩阵乘法,注意你访问内存的顺序,因为CPU缓存很重要。 -
关于我的第三点,请参见例如stackoverflow.com/a/7395643/1405588
-
@Eugene Nah,单个
std::vector<double>要好得多,可能包装在 Matrix 类中 -
请发布一个无效的变体,而不是一个有效的变体。 (据我所知,这应该在几秒钟内完成。)