2014-11-04 3 views
0

Я пытаюсь создать программу, которая создает матрицу с использованием векторов векторов целых чисел, а затем умножает ее на другую матрицу. Я знаю, как умножать матрицы на бумаге, но когда я пытаюсь реализовать ее в своей программе, я не заставляю ее работать. Я знаю, что обе матрицы введены правильно и передаются правильно, так как у меня есть выход этих функций, чтобы я мог отлаживать. Программа работает некорректно, когда я пытаюсь их умножить. Ответ и количество элементов неверны. Я знаю, что я что-то упускаю, но не могу понять, что.Умножение матриц с использованием 2d векторов в C++

Matrix Matrix::operator*(Matrix m){ 
    vector<int> mRow = m.getRow(0); 
    vector<int> mCol = m.getCol(0); 
    vector<int> newElem; 
    int product = 0; 

    //adds the contents of the 2nd matrix to the 2d vector 
    vector< vector<int> > m2(mRow.size(), vector<int>(mCol.size()));   
    for (int i = 0; i < mRow.size(); i++){ 
     mRow.clear(); 
     mRow = m.getRow(i); 
     for (int j = 0; j < mCol.size(); j++){ 
      m2[j][i] = mRow[j]; 
     } 

    } 

    //Multiplies the matrices using the 2d matrix**THIS IS WHERE IT GOES WRONG** 
    for (int i = 0; i < row; i++){ 
     for (int j = 0; j < column; j++){ 
      product += matrix[i][j]*m2[j][i]; 
     } 
     newElem.insert(newElem.begin()+i,product); 
     product = 0; 
    } 

    //displays the products so that i can see if its working 
    for (int i = 0; i < newElem.size(); i++){ 
     cout << " "<<newElem[i]<<endl; 
    } 

    //adds the new product vector to a new Matrix object and returns it 
    Matrix newM(row, mCol.size()); 
    vector<int> temp; 
    for (int i = 0; i < row; i++){ 
     for (int j = 0; j < mCol.size(); j++){ 
      temp.insert(temp.begin()+j, newElem[0]); 
      newElem.erase(newElem.begin()); 
     } 
     newM.setRow(temp,i); 
     temp.clear(); 
    } 
    return newM; 
} 

Хотя я не знаю, помогает ли это, я использую this сайт в качестве эталона для умножения матриц 2 вместе.

+0

Не следует ли сбросить «продукт» во внешнюю петлю умножения? – Keugyeol

+0

ya i should, thats исправлено, но я до сих пор не получаю полных результатов. Поэтому, если у меня есть 3x3 * 3x3, я должен получить 9 элементов; я только получаю 3. – a22asin

ответ

0

Ваше матричное представление не имеет ничего общего с вашей ошибкой. У вас должно быть больше вложенных итераций. Подумайте о матрице результатов и повторите это, чтобы вычислить каждый элемент. В псевдокоде:

for i in result column 
for j in result row 
    res[i, j] = multiply(m1, m2, i, j) 

где функция умножения является вложенной цикл, что-то вроде этого:

multiply(m1, m2, i, j) 
{ 
    val = 0; 
    for k in row 
    val += m1[i, k] * m2[k, j] 
return val 
} 

Вот реализация внешних контуров. Имейте в виду, в коде нет ошибок.

vector<vector<int> > ml; 
vector<vector<int> > mr; 
// fill in ml and mr 
... 

// result matrix 
vector<vector<int> > res; 

// allocate the result matrix 
res.resize(ml.size()); 
for(it = res.begin(); it != res.end(); ++it) 
    it->resize(ml[0].size()); 


// loop through the result matrix and fill it in 
for(int i = 0; i < res.size(); ++i) 
    for(int j = 0; j < res[0].size(); ++j) 
     res[i][j] = multiply(ml, mr, i, j); 

Оставив правильную реализацию функции multiply() для вас.

+0

thats проблема im имея, я не могу даже получить реализацию в псевдокоде. Это похоже на то, что у меня есть блок авторов или что-то в этом роде. Я должен был вытащить его на бумаге, но им все равно не получилось правильно при его реализации. – a22asin

+0

Я добавил некоторый реальный код. Это поможет? – dmitri

+0

ya, что помогло, спасибо – a22asin

Смежные вопросы