(线代)施密特正交化

转载 2012年03月29日 18:35:42
// ***************************************************************
//  GramSchmit   version:  1.0   date: 05/24/2007
//  -------------------------------------------------------------
//  作者:luckdst
//  -------------------------------------------------------------
//  Copyright (C) 2007 
// ***************************************************************
// 
// ***************************************************************
#include "cv.h"
#include "cxcore.h"
#include "cvaux.h"
#include <iostream>
using namespace std;
//按行操作,要被正交化的向量以行的形式放在src里面,输出正交向量以行 
//的形式放dst里面,输出向量没有单位化. 
void GramSchmidt(const CvMat* src, CvMat* dst)
{
	int i,j;
	double param,param1,param2;
	assert(src!=NULL&&dst!=NULL);
	assert(src->cols==dst->cols&&src->rows==dst->rows);
	CvMat *VecSrc = cvCreateMat(1, src->cols, CV_64FC1);
	CvMat *VecDst = cvCreateMat(1, dst->cols, CV_64FC1);
	CvMat *VecTmp = cvCreateMat(1, dst->cols, CV_64FC1);
	cvZero(VecSrc);
	cvZero(VecDst);
	for(i=0;i<dst->rows;i++)
	{
		cvGetRow(src, VecDst, i);
		cvGetRow(src, VecSrc, i);
		for(j=0;j<i;j++)
		{
			cvGetRow(dst, VecTmp, j);
			param1=cvDotProduct(VecSrc,VecTmp);
			param2=cvDotProduct(VecTmp,VecTmp);
			param=param1/param2;
			cvAddWeighted(VecTmp,-param,VecDst,1.0,0,VecDst);
		}		
		memcpy(dst->data.db+i*dst->cols,VecDst->data.db,dst->cols*sizeof(double));
	}
	cvReleaseMat(&VecSrc);
	cvReleaseMat(&VecDst);
	cvReleaseMat(&VecTmp);
}

int main(int argc, char *argv[]) 
{
	int i,j;
	CvMat *Ma,*Mb;
	Ma= cvCreateMatHeader( 3, 4, CV_64FC1 );
	Mb=NULL;

	const double a[] = { 1, 0,1, 1, 
						 0,1, 1, 0,
						 0, 0,1,1,};
	cvInitMatHeader( Ma, 3, 4, CV_64FC1, (void *)a);
	Mb=cvCreateMat(Ma->rows,Ma->cols,CV_64FC1);
	GramSchmidt(Ma,Mb);
	//printf out
	for(i=0;i<Mb->rows;i++)
	{
		for(j=0;j<Mb->cols;j++)
		{
			cout<<CV_MAT_ELEM(*Mb,double,i,j)<<"  ";
		}
		cout<<endl;
	}
	cout<<endl;
	///////////////////////////////////
	//test
	CvMat *M1=cvCreateMat(1,Ma->cols,CV_64FC1);
	CvMat *M2=cvCreateMat(1,Ma->cols,CV_64FC1);
	double s;
	for(i=0;i<Mb->rows;i++)
	{
		cvGetRow(Mb, M1, i);
		for(j=0;j<Mb->rows;j++)
		{
			cvGetRow(Mb, M2, j);
			s=cvDotProduct(M2,M1);
			cout<<s<<"      ";
		}
		cout<<endl;
	}
	cvReleaseMat(&Ma);
	cvReleaseMat(&Mb);
	return 0;
}

施密特正交化的几何解释

线性代数中最头疼的公式恐怕就是施密特正交化了。但其实搞清楚它的几何原理之后公式的记忆就简单多了,数学重在理解!给定一组基α1,α2,...,αn\alpha_1,\alpha_2,...,\alpha...
  • newworld123made
  • newworld123made
  • 2016年05月19日 01:25
  • 9203

漫步线性代数十八——正交基和格拉姆-施密特正交化(下)

格拉姆-施密特声明:以后博主会把文章的pdf版本陆续发布到的网上,免费供大家下载 正交基和格拉姆-施密特正交化假设我们有是是三个无关向量a,b,ca,b,c,如果他们是正交的,那么会多问题都变得容易...
  • u010182633
  • u010182633
  • 2016年09月08日 21:15
  • 2220

matlab-线性代数 施密特正交化

慈心积善融学习,技术愿为有情学。善心速造多好事,前人栽树后乘凉。我今于此写经验,愿见文者得启发。 %施密特正交化,自己写的你们看着,有错误自行修改 a=ones(4,2); %...
  • yushaopu
  • yushaopu
  • 2016年06月30日 10:28
  • 2768

自己动手写施密特正交化

import numpy as np A = np.array([[1,1,0],[0,1,1],[1,0,1]],dtype=float) Q = np.zeros_like(A) m = shap...
  • panghaomingme
  • panghaomingme
  • 2017年03月09日 17:31
  • 1937

列正交化-施密特正交化方法

a1=[1 1 0 0]; a2=[1 0 1 0]; a3=[-1 0 0 1]; A=[a1',a2',a3]; u=A; [m,n] = size(u); y = u; y(:,1) = y(:...
  • compression
  • compression
  • 2015年10月26日 17:29
  • 2344

漫步线性代数十七——正交基和格拉姆-施密特正交化(上)

对于一个正交基,每个向量和其他所有向量垂直,坐标轴就是互相正交的。我们还可以进一步改善:每个向量除以它的长度得到单位向量,这样的话正交基变成了标准正交基:16、如果 qTiqj={01i≠j,给出正...
  • u010182633
  • u010182633
  • 2016年09月06日 23:09
  • 3157

施密特(Schimidt)正交化与正交匹配追踪

上一篇《稀疏表示与匹配追踪》中详细的解释了匹配追踪(Matching Pursuit,MP)的流程,在最后给出了正交匹配追踪(Orthogonal Matching Pursuit,OMP)的流程,并...
  • jbb0523
  • jbb0523
  • 2015年04月17日 18:10
  • 7743

线性代数(三十九) :格拉姆-施密特正交化与标准正交基

本节介绍正交的概念,以及将基变为正交基的格拉姆-施密特(Gram-Schmidt)方法 0 回顾正交基 1 正交 如果向量x,y满足: 则称x与y正交(orthogonal)或者垂直(perpen...
  • xxingjjing
  • xxingjjing
  • 2014年03月24日 19:41
  • 6983

格拉姆-施密特正交化Gram-Schimidt

格拉姆-施密特正交化 维基百科,自由的百科全书 跳转到: 导航, 搜索 跳过字词转换说明 汉漢▼▲ 线性代数 ...
  • alec1987
  • alec1987
  • 2012年04月11日 15:48
  • 2852

【通俗理解线性代数】 -- 施密特正交化与QR分解

我们介绍线性代数知识的时候,稍微扩展一点,就能演变成一个新的角度。
  • LSGO_MYP
  • LSGO_MYP
  • 2017年04月02日 11:17
  • 2893
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:(线代)施密特正交化
举报原因:
原因补充:

(最多只允许输入30个字)