最近两周做的项目是要将matlab里面的算法转变为C语言,matlab处理矩阵运算实在太牛B了,几个简单的字符就代表了很多的操作,为了项目的需要,又不能影响软件运行速度,因此我在工程中使用了OpenCV的库进行矩阵操作。好在有这个使用比较方便的开源库啊!
在matlab中,可以随意给一个变量(通常都是突然出现的)传递任意维数的矩阵,这下可苦了我们这些做“翻译”工作的程序员了。闲话少说,还是介绍一下我使用矩阵的理解吧。
OpenCV中,可以将一个矩阵和一个数组(或是指针)关联起来,这样对矩阵进行运算,关联的数组的元素值就会改变。有时候可以比较方便的用指针进行后续的操作。
举个例子吧:
CvMat *temp;
float a[9];
temp = cvCreatMat(3,3,CV_32FC1);(这个不能少)
cvInitMatHeader(temp,3,3,CV_32FC1,a,CV_ATUO_STEP);(这里矩阵形式可以有很多)
(上次这个地方描述有错误,这里内容关联的时候,temp最好使用CvMat类型的引用即CvMat temp,cvInitMatHeader(&temp,3,3,CV_32FC1,a,CV_ATUO_STEP);,向上面说的那样,也可以得到正确的结果,不过有内存泄漏,因为cvInitMatHeader的返回值是一个CvMat*,相当于分配了两次空间,最后cvReleaseMat的时候就容易内存泄漏,这是在工程实际运行中测试发现的。不过不知道cvReleaseMat两次能不能解决内存泄漏,太麻烦了就没有实验。)
这样数组a与矩阵temp就关联起来了,如果该矩阵进行一些操作后,如果矩阵里面元素的值改变了,那么a数组对应的元素值也会改变。
操作完了之后,如果cvReleaseMat(temp);矩阵空间释放了,但是a数组的值还是存在的,不受影响。
还有一个比较好用的函数,cvReduce,可以对应matlab里面的[log, index] = sum(ans);(min(ans))之类的操作,不过cvReduce的功能要少一些,只能求出每行(列)最大(最小或平均等)值,无法给出index项,如果需要index还需要另外自己进行判断。