Как использовать векторный элемент доступа через функцию - PullRequest
0 голосов
/ 30 ноября 2018

Этот код сделан для умножения двух массивов, заданных пользователем

typedef vector<vector<int> > arr ;


void multiply (arr &arr1 ,arr &arr2 )
 {
arr res ;
  unsigned new_row = arr1.size() ;
unsigned new_col = arr2.at(0).size();
for(int i = 0 ; i < new_row ; i++)
  {
    vector <int> vec ;
    res.push_back(vec ) ;
    for(int j = 0 ; j<new_col ;j++)
    {
        int x = 0 ;
        res.at(i).push_back(x);
        for(unsigned k =0 ; k <arr2.size();k++)
        {
            res.at(i).at(j) +=           arr1.at(i).at(k)*arr2.at(k).at(j);
        }
        cout<< res.at(i).at(j) ;
   }
    }

  }    
  int main()
  {
unsigned rows_number1 = 0 , columns_number1 = 0 ;

arr arr1 ;

cout<<"MATRIX A "<<endl<<endl ;
cout << "The Rows : " ;
cin >> rows_number1 ;
cout << "The Columns :" ;
cin>> columns_number1 ;
for(int i = 0 ; i<rows_number1;i++)
{
    vector<int> newr ;
    arr1.push_back(newr);
    for(int j = 0; j<columns_number1 ;j++)
    {
        int x ;
        cout<<"The Member ("<<i+1<<","<<j+1 <<") :" ;
        cin>>x ;
        arr1.at(i).push_back(x);

    }
}
unsigned rows_number2 = 0 , columns_number2 = 0 ;

arr arr2 ;

cout<<"MATRIX B "<<endl<<endl ;
cout << "The Rows : " ;
cin >> rows_number2 ;
cout << "The Columns :" ;
cin>> columns_number2 ;
for(int i = 0 ; i<rows_number2;i++)
{
    vector<int> newr ;
    arr1.push_back(newr);
    for(int j = 0; j<columns_number2 ;j++)
    {
         int x ;
        cout<<"The Member ("<<i+1<<","<<j+1 <<") :" ;
        cin>>x ;
        arr1.at(i).push_back(x);

    }
}

system("cls");

if(columns_number1!=rows_number2)
{
    cout<<"Error Multiplication Dimensions" <<endl ;
}
else
{
    cout << "A * B ="<<endl;
    multiply(arr1,arr2);
 }
 }

, почему возникает ошибка, и как по-другому ??Как я могу улучшить код для умножения двух массивов Отредактировано: я попытался с двумя массивами 2 * 2, используя консольный ввод и вывод, и это мой полный код
Проблема в исключении out_of_range, но я не знаю, почему

1 Ответ

0 голосов
/ 30 ноября 2018

При многократном умножении на матрицы на входе накладываются строгие ограничения.

  1. Количество столбцов первой матрицы должно совпадать с количеством строк второй матрицы.
  2. Когда ваша матрица представлена ​​std::vector<std::vector<int>>, вам необходимо убедиться, что ВСЕ вложенные std::vector имеют одинаковый размер.

Кроме того, непредположим, что arr2 не пусто.Когда он пуст, arr2.at(0) вызовет исключение.

Вот более надежная версия вашей функции.

void multiply (arr &arr1 ,arr &arr2 )
{
   arr res;

   unsigned num_rows1 = arr1.size();
   if ( num_rows1 == 0 )
   {
      // Can't do much.
      // Return.
      return res;
   }


   unsigned num_cols1 = arr1[0].size();
   if ( num_cols1 == 0 )
   {
      // Can't do much.
      // Return.
      return res;
   }

   // Inner vector size check of arr1.
   for(unsigned int i = 1 ; i < num_rows1 ; i++)
   {
      if ( num_cols1 != arr1[i].size() )
      {
         throw std::runtime_error("Bad input");
      }
   }

   // Make sure the number of columns in arr1 is the same as
   // number of rows in arr2.
   unsigned num_rows2 = arr2.size();
   if ( num_cols1 != num_rows2 )
   {
      throw std::runtime_error("Bad input");
   }

   unsigned num_cols2 = arr2[0].size();
   if ( num_cols2 == 0 )
   {
      // Can't do much.
      // Return.
      return res;
   }

   // Inner vector size check of arr2.
   for(unsigned int i = 1 ; i < num_rows2 ; i++)
   {
      if ( num_cols2 != arr2[i].size() )
      {
         throw std::runtime_error("Bad input");
      }
   }

   // All inputs appear to be valid.
   // Now, do the multiplication.

   unsigned new_row = num_rows1;
   unsigned new_col = num_cols2;

   res.resize(num_rows1);
   for(unsigned i = 0 ; i < new_row ; i++)
   {
      for(unsigned j = 0 ; j<new_col ;j++)
      {
         int x = 0 ;
         res.at(i).push_back(x);
         for(unsigned k =0 ; k < num_cols1; k++)
         {
            res.at(i).at(j) += arr1.at(i).at(k)*arr2.at(k).at(j);
         }
         cout<< res.at(i).at(j) ;
      }
   }
}    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...