2008年9月11日 星期四

OpenCV線性代數-正交投影向量計算

向量空間,為一個可被多個向量基底線性組合的向量集合,也就是有許多的向量基底它可以用任意數據的線性組合產生另外一個向量,存在的那個向量就被稱為是向量空間的一部分,在這邊,要用一個向量空間來計算另外一個向量的正交投影,正交投影表示的是存在向量空間的一個向量它是另外一個向量的投影向量,而且該向量減去它的投影向量會跟向量空間正交(垂直),存在於向量空間的那個向量就稱為正交投影向量(orthogonal projection vector)



由這張圖可以看出,W為一個向量空間,v為一個向量,而proj_v為v的正交投影向量,v-proj_v則會與W向量空間正交,正交投影向量的計算方式如下


A為W空間向量基底的集合,為一個行向量(column vector)的矩陣,v則是要計算正交投影的目標向量,而它的程式計算,則是下面的方式


正交投影向量計算
#include <cv.h>
#include <stdio.h>


float array1[]={1,1,2,-1,-2,0,1,1};
float array2[]={1,2,3,4};

void PrintMatrix(CvMat *Matrix,int Rows,int Cols,int Channels);

int main()
{
    CvMat *A=cvCreateMat(4,2,CV_32FC1);
    CvMat *v=cvCreateMat(4,1,CV_32FC1);
    CvMat *Transpose_A=cvCreateMat(2,4,CV_32FC1);
    CvMat *MulTransposed_A=cvCreateMat(2,2,CV_32FC1);
    CvMat *tempMatrix1=cvCreateMat(4,2,CV_32FC1);
    CvMat *tempMatrix2=cvCreateMat(2,1,CV_32FC1);
    CvMat *proj_v=cvCreateMat(4,1,CV_32FC1);
    cvSetData(A,array1,A->step);
    cvSetData(v,array2,v->step);

    cvTranspose(A,Transpose_A);
    cvMulTransposed(A,MulTransposed_A,1);
    cvInvert(MulTransposed_A,MulTransposed_A);
    cvmMul(A,MulTransposed_A,tempMatrix1);
    cvmMul(Transpose_A,v,tempMatrix2);
    cvmMul(tempMatrix1,tempMatrix2,proj_v);

    PrintMatrix(proj_v,4,1,1);
    system("pause");
}
void PrintMatrix(CvMat *Matrix,int Rows,int Cols,int Channels)
{
    for(int i=0;i<Rows;i++)
    {
        for(int j=0;j<Cols;j++)
        {
            for(int k=0;k<Channels;k++)
            {
                printf("%.2f ",cvGet2D(Matrix,i,j).val[k]);
            }
        }
        printf("\n");
    }
}

執行結果:


這裡用到了前面許多運算的函數,cvTranspose(),cvInvert(),cvmMul()以及cvMulTransposed(),cvMulTransposed()轉置相乘的乘積第一個引數為輸入CvMat矩陣向量,第二個引數為輸出CvMat矩陣向量,第三個引數為計算方式,分別為原矩陣乘以原矩陣轉置或是原矩陣轉置在乘以原矩陣的選擇,0為原矩陣與原矩陣轉置相乘,1為原矩陣轉置乘以原矩陣.正交投影的計算方法如下.


cvMulTransposed()
計算原矩陣與原矩陣轉置相乘,或是原矩陣轉置與原矩陣的乘積,因為原矩陣轉置相乘為對稱矩陣,因此可以用一些特殊算法來加快矩陣相乘的乘積,cvMulTransposed()第一個引數為輸入CvMat原矩陣資料結構,第二個引數為輸出CvMat資料結構,第三個引數為cvMulTransposed()這函式的參數,0為原矩陣與原矩陣轉置相乘,1為原矩陣轉置與原矩陣的乘積,第四個引數為輸入CvMat資料結構,將原矩陣與第四個引數的矩陣做相減,再做原矩陣轉置相乘原矩陣或是原矩陣相乘原矩陣轉置的運算
cvMulTransposed(輸入CvMat原矩陣資料結構,輸出CvMat資料結構,0或1的參數,輸入CvMat矩陣相減資料結構)



0 意見:

Copyright 2008-2009,yester