Матричное умножение со случайными числами больше 1000

Я пытаюсь получить две матрицы со случайно сгенерированными числами для умножения вместе, но я продолжаю получать ошибку сегментации и знаю, как правильно распределить память.

любая помощь с этим была бы велика

// вот код

#include<iostream>
#include<iomanip>
#include<stdlib.h>
#include<stdio.h>
#include<ctime>

using namespace std;
int main()
{ 
srand (1023);
int a[1000][1000], b[1000][1000], mult[1000][1000], r1, c1, r2, c2, i, j, k;
cout << "Enter rows and columns for first matrix: ";
cin >> r1 >> c1;
cout << "Enter rows and columns for second matrix: ";
cin >> r2 >> c2;

while (c1!=r2)
{
   cout << "Error! column of first matrix not equal to row of second.";

}

cout << endl << endl;
for(i=0; i<r1; ++i)
for(j=0; j<c1; ++j)
{
    cout<<"mult["<<i<<"]["<<j<<"]: "<<rand()%9+1<<" "; //random matrix 1
}

cout << endl<< endl;
for(i=0; i<r2; ++i)
for(j=0; j<c2; ++j)
{
    cout<<"mult["<<i<<"]["<<j<<"]: "<<rand()%9+1<<" "; //random matrix 2
}

for(i=0; i<r1; ++i)
for(j=0; j<c2; ++j)
{
   mult[i][j]=rand()%9+1;
}


for(i=0; i<r1; ++i)
for(j=0; j<c2; ++j)
for(k=0; k<c1; ++k)
{
    mult[i][j]+=a[i][k]*b[k][j]; //matrix multiplication
}

cout << endl << "Output Matrix: " << endl;
clock_t begin = clock();
for(i=0; i<r1; ++i)
for(j=0; j<c2; ++j)
    cout << " " << mult[i][j];
    if(j==c2)
        cout << endl;
clock_t end = clock();
    double elapsed_secs = double(end-begin)*100;
    cout<<"Elapsed Time: "<<elapsed_secs<<" milliseconds\n";
return 0;
}

1 ответ

Вы пытаетесь создать более 11 МБ в текущем стеке.

массив [1000][1000] = 4 * 1000 * 1000 байт = 4000000

Вы создаете в общей сложности 12000000 байтов только для 3 массивов.

Попробуйте уменьшить размер массива (или) получить размер матрицы и попытаться создать массив в куче, используя new.

Проверьте размер стека, он должен быть 8 МБ

ulimit -a | grep stack

Вот как вы делаете для кучи, так как вы хотите от 1000 до 5000

   int** a = new int*[r1];
   for(int i = 0; i < r1; ++i)
   {
      a[i] = new int[c1];
   }

   a[0][0] = 10;

   std::cout << a[0][0] << std::endl;

   // Delete all the columns  
   for(int i = 0; i < r1; ++i)
     delete[] a[i];

   delete []a ;                     

Также убедитесь, что вы добавляете значения в a [] [] и b [] [], теперь вы просто делаете cout и печатаете значения в первых 2 для циклов, и я предполагаю, что они должны быть в a [] [] и b [] []

Другие вопросы по тегам