Матричное умножение - PullRequest
       6

Матричное умножение

7 голосов
/ 17 декабря 2010

У меня есть вопрос, который может быть для начинающих.

Я хочу умножить матрицу 20x2 на матрицу 2x2 в c ++.

Я пробовал это с openCV, но я получаю сообщение об ошибке

Неверный аргумент (неизвестный тип массива) в cvarrToMat


Вот код, который я использовал в openCV для проверки проблемы, если она была с моим кодом или проблема в openCV, но она все еще не работает, я могу скомпилировать без ошибки, но когда я тестирую код, я получить проблему «Неверный аргумент (неизвестный тип массива) в cvarrToMat»

#include <stdio.h>
#include <stdlib.h>
//#include "/usr/include/opencv/cv.h"
#include <cv.h>
#include <cvaux.h>
#include <highgui.h>
#include <math.h>
#include <iostream>

  int main()
{


double a[] = {1, 2, 3, 4};
CvMat Ma;
cvInitMatHeader(&Ma, 2, 2, CV_32FC1, a);


double b[] ={0, -1, 1, 0};

CvMat Mb;
cvInitMatHeader(&Mb, 2, 2, CV_32FC1, b);

CvMat Mc;
CvMat Mc1;
cvMatMul(&Ma, &Mb, &Mc);

return 0;
}

Ответы [ 3 ]

5 голосов
/ 18 декабря 2010

Сравнивая ваш код с примером в документах OpenCV , кажется, что вы забыли инициализировать выходную матрицу Mc:

double a[] = { 1, 2, 3, 4,
               5, 6, 7, 8,
               9, 10, 11, 12 };

double b[] = { 1, 5, 9,
               2, 6, 10,
               3, 7, 11,
               4, 8, 12 };

double c[9];
CvMat Ma, Mb, Mc ;

cvInitMatHeader(&Ma, 3, 4, CV_64FC1, a);
cvInitMatHeader(&Mb, 4, 3, CV_64FC1, b);
cvInitMatHeader(&Mc, 3, 3, CV_64FC1, c);

cvMatMulAdd(&Ma, &Mb, 0, &Mc);
// the c array now contains the product of a (3x4) and b (4x3)

Согласно документам, cvMatMul(&Ma, &Mb, &Mc) такой же, как cvMatMulAdd(&Ma, &Mb, 0, &Mc).

4 голосов
/ 17 декабря 2010

Хорошо. Ответ на этот вопрос действительно зависит от нескольких вещей. Вы сказали, что знаете, как сделать это вручную, поэтому выполнение этого в коде будет зависеть от того, как вы представляете свои матрицы. Теперь, если это разовая вещь, и вам просто нужен ответ, я бы предложил такой язык, как MATLAB, который создан для этого. Если это часть более крупной программы, и вы будете делать много умножений матриц, которые должны быть эффективными, я рекомендую оптимизированную библиотеку высокого качества, такую ​​как boost :: ublas .

Если это одноразовая вещь, и вы действительно хотите сделать это в C ++, и вы действительно не хотите / не знаете, как использовать стороннюю библиотеку, такую ​​как ublas, (неоптимизированное) матричное умножение хотело бы, чтобы следующее:

template<typename T>
struct matrix2d
{
private:
    std::vector<std::vector<T>> data;
    size_t _rows, _columns;
public:
    matrix2d(size_t rows, size_t columns)
        :_rows(rows)
        ,_columns(columns)
    {
        data.resize(_rows, std::vector<T>(_columns));
    }

    size_t rows() const { return _rows; } 
    size_t columns() const { return _columns; } 

    T& operator()(size_t row, size_t column)
    {
        return data[row][column];
    }

    const T& operator()(size_t row, size_t column) const
    {
        return data[row][column];
    }
};

template<typename T>
void mmult(const matrix2d<T>& m1, const matrix2d<T>&m2, matrix2d<T>& result)
{
    for (size_t r = 0 ; r<m1.rows() ; ++r)
        for (size_t c = 0; c<m2.columns() ; ++c)
            for (size_t n = 0; n<m1.columns() ; ++n)
                result(r, c) = m1(r, n) * m2(n, c);
}


int main()
{

    matrix2d<double> m1(20, 2);
    matrix2d<double> m2(2, 2);
    matrix2d<double> result(m1.rows(), m2.columns());
    mmult(m1, m2, result);
}
0 голосов
/ 17 декабря 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...