[英]Matrix multiplication
我有一個可能適合初學者的問題。
我想將20x2矩陣乘以c ++中的2x2矩陣。
我用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;
}
將代碼與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)
。
好。 這個問題的答案實際上取決於幾件事。 您已經說過,您知道如何手動執行此操作,因此在代碼中執行此操作將取決於您如何表示矩陣。 現在,如果這是一次性的事情,而您只需要解決的辦法,我將建議為此而構建的語言,例如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);
}
可能是您應該發布要調用的函數的原型,以及矩陣的聲明和調用。 我認為不是每個人都熟悉openCV。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.