当前位置:文档之家› 矩阵求逆标准算法

矩阵求逆标准算法

矩阵求逆标准算法
矩阵求逆标准算法

矩阵求逆标准算法(VB)源码

2006-11-29 13:49 类别:默认

本程序依据矩阵初等变换的基本原理编写,算法较为繁琐,但易于理解适合VB初学者。

本程序适合任何(n*n)的矩阵求逆,对于不可逆矩阵有提示信息,并结束程序

本程序在XP,VB6.0下调试通过

本程序由本人原创,请慎用。如有疑问,或调试有误,请联系本人QQ 30360126

本程序可在VB6.0内任何地方用call jzqn(qa(),na()))语句调用其中qa()是输入的矩阵数组,调用此函数后 na()为返回的逆矩阵数组

注意:调用本程序前不要声明na()的维数,仅用dim na()即可。

请不要试图对一个病态矩阵求逆、否则计算结果未必是你想要的病态矩阵是指行列式计算结果极其接近于零的矩阵

Public Sub jzqn(qa(), na())

Dim a()

n = UBound(qa, 1)

ReDim na(n, n)

ReDim a(n, 2 * n)

For i = 1 To n

For j = 1 To n

a(i, j) = qa(i, j)

Next j

Next i

For i = 1 To n

For j = n + 1 To 2 * n

If j - i = n Then

a(i, j) = 1

Else

a(i, j) = 0

End If

Next j

Next i

For i = 1 To n

If a(i, i) = 0 Then

For q = i To n

If a(q, i) <> 0 Then

For w = i To 2 * n

zj = a(i, w)

a(i, w) = a(q, w)

a(q, w) = zj

Next w

Exit For

End If

Next q

If q > n Then MsgBox "此矩阵不可逆": Exit Sub End If

For k = 2 * n To i Step -1

a(i, k) = a(i, k) / a(i, i)

Next k

For j = i + 1 To n

If a(j, i) <> 0 Then

For k = 2 * n To i Step -1

a(j, k) = a(j, k) / a(j, i) - a(i, k) Next k

End If

Next j

Next i

For i = n To 1 Step -1

If a(i, i) = 0 Then

For q = i - 1 To 1 Step -1

If a(q, i) <> 0 Then

For w = i To 2 * n

zj = a(i, w)

a(i, w) = a(q, w)

a(q, w) = zj

Next w

Exit For

End If

Next q

End If

For k = 2 * n To i Step -1

a(i, k) = a(i, k) / a(i, i)

Next k

For j = i - 1 To 1 Step -1

If a(j, i) <> 0 Then

xxx = a(j, i)

For k = 2 * n To 1 Step -1

a(j, k) = a(j, k) / xxx - a(i, k)

Next k

End If

Next j

Next i

For i = 1 To n

For j = 1 To n

na(i, j) = a(i, j + n)

Next j

Next i

End Sub

调用示例:下面代码随机产生一个10*10的矩阵,并求逆,打印于窗体

Private Sub Command1_Click()

Dim a(10, 10), b()

Cls

Randomize

For i = 1 To 10

For j = 1 To 10

a(i, j) = Int(Rnd * 100)

Print a(i, j);

Next j

Print

Next i

Print

Call jzqn(a(), b())

For i = 1 To 10

For j = 1 To 10

Print Format(b(i, j), "0.000"),

Next j

Print

Next i

End Sub

矩阵运算是数值运算中经常碰到的,“砖头”抛出多天,尚未“引出玉来”,我自己再来个补充吧!

矩阵求逆上面给出的程序,虽然可以使用,但远不完善,更不精炼。下面将其修改一下,例如:使用IIF ()函数

简化判断分支语句,将“约化”过程合并,添加一个矩阵无逆的判断,……。但还是属于小打小闹的修修补补,希望

诸位能挑出程序中的问题、缺陷,诸位版主和大侠们能从赐以高水平的程序代码,不胜感谢!

修改后的矩阵求逆代码如下:源程序压缩文件如下:

矩阵求逆程序代码

Dim a() As Single

Dim i%, j%, k%, am!, tt%, at!, bt!

Private Sub Command1_Click()

n = InputBox("请输入方阵的阶数N")

ReDim a(n, 2 * n) As Single

For i = 1 To n

For j = 1 To n

a(i, j) = InputBox("请输入a(" & i & "," & j & ")的值") a(i, j + n) = IIf(i = j, 1, 0) … 使用IIf( )函数,简化此判断结构Next j, i

Print "原矩阵的增广矩阵元素"

For i = 1 To n

For j = 1 To 2 * n

Print a(i, j); " ";

Next j

Print

Next i

'________________________________________________ For k = 1 To n

' 换列主元运算,在主元列找出绝对值最大的值作主元at = Abs(a(k, k))

tt = k

For j = k + 1 To n

bt = Abs(a(j, k))

If at < bt Then

at = bt

tt = j

End If

Next j

If tt <> k Then

For j = k To 2 * n

am = a(k, j): a(k, j) = a(tt, j): a(tt, j) = am

Next j

End If

If at < 0.0001 Then Print "此矩阵不可逆"

'逆矩阵计算

'------------------------------------------------

am = 1 / a(k, k)

For j = k To 2 * n

a(k, j) = a(k, j) * am

Next j

'____________________________________

For i = 1 To n

If k <> i Then

am = a(i, k)

For j = 1 To 2 * n

a(i, j) = a(i, j) - a(k, j) * am

Next j

End If

Next i

Next k

'------------------------------------------------

Print "所求逆矩阵"

For i = 1 To n

For j = n + 1 To 2 * n

Print a(i, j); " ";

Next j

Print

Next i

End Sub

矩阵运算,是数值计算中经常碰到的。这里献上的小程序,只能是学习参考,对于矩阵的阶数很大的

实际使用和对于病态(条件数较大)矩阵,如何计算?特别是如何求逆?显然这里的程序力不从心,所以敬请版主大侠们献出爱心!

两矩阵的加、减,很简单,就是现应元素的加、减。条件是两矩阵行、列数都相等。

两矩阵的相乘,分为左乘和右乘;条件是右矩阵的行数等于左矩阵的列数;乘法规则麻烦点,请参看

有关参考材料。

矩阵求逆,是矩阵运算中比较麻烦的,也是用出较多的。求助未得,只好自己来个粗糙的,这次给出

的程序是包括选主元的,一般满秩矩阵都可以求出其逆矩阵。但是效率有问题,对于病态矩阵求出的逆矩阵精度欠佳,不一定满足需要。

为了大家使用方便,将源程序传上。

[attachmentid=498]

[attachmentid=499]

[attachmentid=500]

[attachmentid=501]

在网上收寻了行列式求值的,发现没有能用的,版主以前对最小二乘法多次曲线拟合算法解说里有行列试求值的程序,我调试下了,没能成功,不知道到是不是那里出错了?

现在献上一个比较精确的矩阵求逆算法,希望大家能研究出一种行列式求值的的程序!

Sub JSJZNZA(WS, DA)

Dim DNZ() As Double

YS = WS * (WS + 1) / 2

ReDim DNZ(YS)

For i = 1 To WS

DI = (i - 1) * (WS - i / 2)

For j = i To WS

k = DI + j

DNZ(k) = DA(i, j)

Next j

Next i

For i = 1 To WS

For j = i To WS

s = DNZ(DI + j)

If i = 1 Then

GoTo 156 '(156)

End If

For k = 1 To i - 1

DK = (k - 1) * (WS - k / 2)

s = s - DNZ(DK + i) * DNZ(DK + j) / DNZ(DK + k) Next k

156: If j = i Then '(156)

DNZ(DI + j) = 1 / (s + 0.0000001)

GoTo 160 ' ( 160 )

End If

DNZ(DI + j) = s * DNZ(DI + i)

160: Next j '(160)

Next i

For i = 1 To WS - 1

DI = (i - 1) * (WS - i / 2)

For j = i + 1 To WS

s = (-1) * DNZ(DI + j)

If (i + 1) > (j - 1) Then

GoTo 168 ' ( 168 )

End If

For k = i + 1 To j - 1

DK = (k - 1) * (WS - k / 2)

s = s - DNZ(DI + k) * DNZ(DK + j)

Next k

168: DNZ(DI + j) = s '( 168 )

Next j

Next i

For i = 1 To WS - 1

DI = (i - 1) * (WS - i / 2)

For j = i To WS

DJ = (j - 1) * (WS - j / 2)

If j = i Then

s = DNZ(DI + j)

GoTo 174 ' (174)

End If

s = DNZ(DI + j) * DNZ(DJ + j)

174: If j = WS Then ' (174)

GoTo 178 ' (178)

End If

For k = j + 1 To WS

s = s + DNZ(DI + k) * DNZ(DJ + k) * DNZ(DK + k)

Next k

178: DNZ(DI + j) = s ' (178)

Next j

Next i

'

For i = 1 To WS

DI = (i - 1) * (WS - i / 2)

For j = 1 To WS

DJ = (j - 1) * (WS - j / 2)

Let K1 = DI + j

Let K2 = DJ + i

If j < i Then

DA(i, j) = DNZ(K2)

ElseIf j >= i Then

DA(i, j) = DNZ(K1)

End If

Next j

Next i

ReDim DNZ(1)

End Sub

最近想写一个求矩阵逆阵的函数,上网一搜,有一个叫作高斯约旦法求矩阵的方法,用C 写的,我没看明白,网上大部分都是抄来抄去,全都一个样,所以我按照这个算法的思想,用VB写了一个这样的函数。代码如下:

Option Explicit

'先写一个函数用于交换两个数的函数

Private Sub swap(byref a As Double,byref b As Double)

Dim c As Double

c = a

a = b

b = c

End Sub

'下面是求矩阵逆阵的函数

Public Function Inv(m() As Double) As Double()

Dim i As Integer

Dim j As Integer

Dim k As Integer

Dim n As Integer

Dim tem p As Double

'从第k 行、第k 列开始的右下角子阵中选取绝对值最大的元素,并记住次元素在的行号和列号,

'在通过行交换和列交换将它交换到主元素位置上.这一步称为全选主元

n =UBound(m, 1)

Dim iw() As Integer

Dim jw() As Integer

Dim fMax As Double

ReDim iw(0To n), jw(0To n) As Integer

For k =0To n

fMax = 0

For i = k To n

For j = k To n

If Abs(m(i, j)) > fMax Then fMax = Abs(m(i, j))

iw(k) = i

jw(k) = j

Next j

Next i

If iw(k) <> k Then

For i =0To n

swap m(k, i), m(iw(k), i)

Next i

End If

If jw(k) <> k Then

For i =0To n

swap m(i, k), m(i, jw(k))

Next i

End If

Next k

'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

'在m右边增加一个单位阵,构成一个m的增广矩阵mm

Dim mm() As Double

ReDim mm(0To n, 0To2 * n +1)

For i =0To n

For j =0To n

mm(i, j) = m(i, j)

Next j

Next i

For i =0To n

For j = n +1To2 * n +1

If i = j - n - 1Then

mm(i, j) = 1

Else

mm(i, j) = 0

End If

Next j

Next i

''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

'通过初等行变换(即高斯消去法)使原矩阵变为单位阵,则右边的单位阵即是原矩阵的逆阵

For k =0To n - 1

For i = k + 1To n

tem p = mm(i, k) / mm(k, k)

For j =0To2 * n +1

mm(i, j) = mm(i, j) - mm(k, j) * tem p

Next j

Next i

Next k

For k = n To1Step -1

For i = k - 1To0Step -1

tem p = mm(i, k) / mm(k, k)

For j =2 * n +1To0Step -1

mm(i, j) = mm(i, j) - mm(k, j) * tem p

Next j

Next i

Next k

For i =0To n

Dim s As Double

s = mm(i, i)

For j =0To2 * n +1

mm(i, j) = mm(i, j) / s

Next j

Next i

''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

'输出变换后的右边的矩阵

For i =0To n

For j =0To n

m(i, j) = mm(i, j + n +1)

Next j

Next i

''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

'根据在全选主元过程中所记录的行、列交换的信息进行恢复,恢复的原则如下:在全选主元过程中,

'先交换的行(列)后进行恢复;原来的行(列)交换用列(行)交换来恢复。

For k = n To0Step -1

If jw(k) <> k Then

For i =0To n

swap m(k, i), m(jw(k), i)

Next i

End If

If iw(k) <> k Then

For i =0To n

swap m(i, k), m(i, iw(k))

Next i

End If

Next k

Inv = m

End Function

有必要在这里说明一下,为什么会有选主元这个过程呢?我开始也不理解,后来去图书馆查线性代数相关资料,终于弄明白了。

大意是这样的,对于有些矩阵,矩阵中某个元素的一个很小的变动,会引起最后计算结果误差很大,甚至是面目全非。我们称这种矩阵为病态矩阵。但有些时候不正确的计算方法也会使一个正常的矩阵在运算中表现出病态。对于高斯消去法来说,如果主元(即对角线上的元素)上的元素很小,在计算时就会表现出病态的特征.计算机在计算浮点数时不是绝对精确的,有一定的舍入误差.这点小小的误差最终会使结果大出所料,(家可以用一个二阶的小矩阵试一下,将11位置上的数定为0.00001,其他地方都用个位数就行了).所以要通过全选主元法来使对角线上的元素最大.求完逆阵后,再按原顺序换回去就可以得到原矩阵的逆阵了. 个人感觉,有点复杂了(尤其是行变换时)欢迎大家对我的程序作出一些改进,不甚感激!

总结求矩阵的逆矩阵的方法

总结求矩阵的逆矩阵的方法 课程名称: 专业班级: 成员组成: 联系方式:

摘要:矩阵是线性代数的主要内容,很多实际问题用矩阵的思想去解既简单又快 捷.逆矩阵又是矩阵理论的很重要的内容, 逆矩阵的求法自然也就成为线性代数研究的主要内容之一.本文将给出几种求逆矩阵的方法. 关键词:矩阵逆矩阵方法 Method of finding inverse matrix Abstract: Matrix in linear algebra is the main content,many prictical problems with the matrix theory is simple and fast. The inverse matrix andmatrix theory the important content, the solution of inverse matrix nature has become one of the main research contents of linear algebra. The paper will give some method of finding inverse matrix. Key words: Matrix inversematrix method

正文: 1.引言:矩阵是线性代数的主要内容,很多实际问题用矩阵的思想去解既简单又快捷.逆矩阵又是矩阵理论的很重要的内容, 逆矩阵的求法自然也就成为线性代数研究的主要内容之一.本文将给出几种求逆矩阵的方法. 2.求矩阵的逆矩阵的方法总结: 2.1 矩阵的基本概念 矩阵,是由个数组成的一个行列的矩形表格,通常用大写字母表示,组成矩阵的每一个数,均称为矩阵的元素,通常用小写字母其元素表示,其中下标都是正整数,他们表示该元素在矩 阵中的位置。比如,或表示一个矩阵,下标表示元素位于该矩阵的第行、第列。元素全为零的矩阵称为零矩阵。 特别地,一个矩阵,也称为一个维列向量;而一个矩阵,也称为一个维行向量。 当一个矩阵的行数与烈数相等时,该矩阵称为一个阶方阵。对于方阵,从左上角到右下角的连线,称为主对角线;而从左下角到右上角的连线称为付对 角线。若一个阶方阵的主对角线上的元素都是,而其余元素都是零,则称 为单位矩阵,记为,即:。如一个阶方阵的主对角线上(下)方的元素都是零,则称为下(上)三角矩阵,例如, 是一个阶下三角矩阵,而则是一个阶上三角矩阵。今后我们用表示数域上的矩阵构成

复数矩阵求逆运算

所以按照以上介绍的方法,用C语言实现过程如下: #include #include float getA(float **arcs, int n)//按第一行展开计算|A| { if(n==1) { return arcs[0][0]; } int i,j,k; float ans = 0; float **temp = (float **)malloc(sizeof(float *) * n); for(i = 0; i < n; i++){ temp[i] = (float *)malloc(sizeof(float *) * n); } for(i=0;i=i)?k+1:k]; } }

float t = getA(temp,n-1); if(i%2==0) { ans += arcs[0][i]*t; } else { ans -= arcs[0][i]*t; } } return ans; } void getAStart(float **arcs,int n,float **ans) { if(n==1) { ans[0][0] = 1; return; } int i,j,k,t; float num = getA(arcs,n); float **temp = (float **)malloc(sizeof(float *) * n); for(i = 0; i < n; i++){ temp[i] = (float *)malloc(sizeof(float *) * n); } for(i=0;i=i? k+1:k][t>=j? t+1:t]; //找出除第i行第j列的(n-1)矩阵 } } ans[j][i] = getA(temp,n-1) / num; //计算arcs[i][j]的余子式 if((i+j)%2 == 1) {

2-2逆矩阵及其运算

线性代数 第二节逆矩阵及其运算 一、逆矩阵的概念和性质五、初等变换求逆矩阵 四、矩阵的初等变换和初等矩阵二、矩阵可逆的条件三、用伴随矩阵法求逆矩阵

线性代数 (或称的逆);其中为的倒数, a 1 1 a a -=a , 1 1 1aa a a --==在数的运算中,对于数,有 是否存在一个矩阵,. 1 1 AA A A E --==在矩阵的运算中,单位矩阵E 相当于数的乘法运算中 的1, 那么,对于矩阵A ,1 A -使得一、逆矩阵的概念和性质 0a ≠

线性代数 对于n 阶矩阵A ,如果有一个n 阶矩阵B ,使得 则说矩阵A 是可逆矩阵或非奇异矩阵,并把矩阵B 称为A 的逆矩阵,否则称A 是不可逆矩阵或奇异矩阵。 , AB BA E ==例1设,01011010A B -????== ? ?-???? ,AB BA E ==∴B 是A 的一个逆矩阵。 定义1(可逆矩阵)

线性代数 例1 设,2110A ?? = ? -?? 解 设是A 的逆矩阵,a b B c d ?? = ? ??则2110a b AB c d ????= ???-????1001?? = ? ?? 221001a c b d a b ++?????= ? ?--????求A 的逆矩阵

线性代数 ,,,, 212001a c b d a b +=??+=??? -=??-=?, ,,. 0112a b c d =??=-??? =??=?又因为 ??? ??-01120112-?? ?????? ??-0112=0112-?? ???,1001?? = ??? 所以 .1 0112A --?? = ? ?? A B A B (待定系数法)

逆矩阵的几种常见求法

逆矩阵的几种常见求法 潘风岭 摘 要 本文给出了在矩阵可逆的条件下求逆矩阵的几种常见方法,并对每种方法做了具体的分析和评价,最后对几种方法进行了综合分析和比较. 关键词 初等矩阵; 可逆矩阵 ; 矩阵的秩; 伴随矩阵; 初等变换. 1. 相关知识 1.1 定义1 设A 是数域P 上的一个n 级方阵,如果存在P 上的一个n 级方阵B ,使得AB=BA=E,则称A 是可逆的,又称A 是B 的逆矩阵.当矩阵A 可逆时,逆矩阵由A 唯一确定,记为1-A . 定义2 设()ij n n A a ?=,由元素ij a 的代数余子式ij A 构成的矩阵 11 2111222212n n n n nn A A A A A A A A A ?? ? ? ? ??? 称为A 的伴随矩阵,记为A *. 伴随矩阵有以下重要性质 AA *= A *A=A E. 注:注意伴随矩阵中的元素ij A 的排列顺序. 1.2 哈密尔顿-凯莱定理

设A 是数域P 上的一个n n ?矩阵,f A λλ=E-()是A 的特征多项式, 则 11122()10n n n nn f A A a a a A A E -=-++ ++ +-=()() (证明参见[1]) . 1.3 矩阵A 可逆的充要条件 1.3.1 n 级矩阵A 可逆的充分必要条件是A 0≠(也即()rank A n =); 1.3.2 n 级矩阵A 可逆的充分必要条件是A 可写成一些初等矩阵的乘积(证明参见[1]); 1.3.3 n 级矩阵A 可逆的充分必要条件是A 可以通过初等变换(特别只通过初等行或列变换)化为n 级单位阵(证明参见[1]); 1.3.4 n 级矩阵A 可逆的充分必要条件是存在一个n 级方阵B ,使得AB=E (或BA=E ); 1.3.5 n 级矩阵A 可逆的充分必要条件是A 的n 个特征值全不为0;(证明参见[2]); 1.3.6 定理 对一个s n ?矩阵A 作一初等行变换就相当于在A 的左边乘上相应的s s ?初等矩阵;对A 作一初等列变换就相当于在A 的右边乘上相应的n n ?初等矩阵.(证明参见[1]) 2.矩阵的求逆 2.1 利用定义求逆矩阵 对于n 级方阵A ,若存在n 级方阵B ,使AB=BA=E ,则1B A -=.

总结求矩阵的逆矩阵的方法

总结求矩阵的逆矩阵的方法-标准化文件发布号:(9556-EUATWK-MWUB-WUNN-INNUL-DDQTY-KII

总结求矩阵的逆矩阵的方法 课程名称: 专业班级: 成员组成: 联系方式:

摘要:矩阵是线性代数的主要内容,很多实际问题用矩阵的思想去解既简单又快捷.逆矩阵又是矩阵理论的很重要的内容, 逆矩阵的求法自然也就成为线性代数 研究的主要内容之一.本文将给出几种求逆矩阵的方法. 关键词:矩阵逆矩阵方法 Method of finding inverse matrix Abstract: Matrix in linear algebra is the main content,many prictical problems with the matrix theory is simple and fast. The inverse matrix andmatrix theory the important content, the solution of inverse matrix nature has become one of the main research contents of linear algebra. The paper will give some method of finding inverse matrix. Key words: Matrix inversematrix method

正文: 1.引言:矩阵是线性代数的主要内容,很多实际问题用矩阵的思想去解既简单又快捷.逆矩阵又是矩阵理论的很重要的内容, 逆矩阵的求法自然也就成为线性代数研究的主要内容之一.本文将给出几种求逆矩阵的方法. 2.求矩阵的逆矩阵的方法总结: 2.1 矩阵的基本概念 矩阵,是由个数组成的一个行列的矩形表格,通常用大写字母表示,组成矩阵的每一个数,均称为矩阵的元素,通常用小写字母其元素表示,其中下标都是正整数,他们表示该元素 在矩阵中的位置。比如,或表示一个 矩阵,下标表示元素位于该矩阵的第行、第列。元素全为零的矩阵称为零矩阵。 特别地,一个矩阵,也称为一个维列向量;而一个矩阵,也称为一个维行向量。 当一个矩阵的行数与烈数相等时,该矩阵称为一个阶方阵。对于方阵,从左上角到右下角的连线,称为主对角线;而从左下角到右上角的连线称 为付对角线。若一个阶方阵的主对角线上的元素都是,而其余元素都是零,则称为单位矩阵,记为,即:。如一个阶

利用初等行变换求矩阵的逆运算的代码

/**************reverse matrix************************/ //利用的是AX=B,X=A’B,这里B=E;进行初等行变换求解,把左边化为单位阵,右边就是A矩阵的逆矩阵; void swap(double *a,int i,int line,int n) // exchange line//交换行位置,i控制行号,line也是行号,//n是矩阵列数 { int j; double temp; for(j=0;jmax) { max=fabs(p[j*n+i]); temp=p[j*n+i]; line=j; } } if(max<=1e-5) { printf("no inverse array\n"); return; } if(line!=i) {

swap(p,i,line,n);//将每一列中最大行换到i行 swap(q,i,line,n); } for(k=0;k0;i--) { for(j=i-1;j>=0;j--)//从下往上每一行进行计算,与前面相反 { mmul=p[j*n+i]; p[j*n+i]-=p[i*n+i]*mmul; for(k=0;k

矩阵求逆的并行算法

.矩阵求逆的并行算法: #include "stdio.h" #include "stdlib.h" #include "mpi.h" #define intsize sizeof(int) #define floatsize sizeof(float) #define A(x,y) A[x*N+y] #define Q(x,y) Q[x*N+y] #define a(x,y) a[x*N+y] #define f(x) f[x] float *A,*Q; float *a,*f; int N,v,m; int p; int myid; MPI_Status status; FILE *dataFile; double starttime,endtime,time1; void readData() { int i,j; starttime = MPI_Wtime(); dataFile = fopen("dataIn.txt","r"); fscanf(dataFile,"%d",&N); A = (float *)malloc(floatsize*N*N); for(i = 0; i < N; i++) { for(j = 0; j < N; j++) { fscanf(dataFile,"%f",&A(i,j)); } } fclose(dataFile); printf("Input of file \"dataIn.txt\"\n"); printf("%d\n",N); for(i = 0; i < N; i++) { for(j = 0; j < N; j++) { printf("%f\t",A(i,j)); } printf("\n");

求逆矩阵的方法

求逆矩阵的方法与矩阵的秩 一、矩阵的初等行变换 (由定理2.4给出的求逆矩阵的伴随矩阵法,要求计算矩阵A 的行列式A 值和它的伴随矩阵*A .当A 的阶数较高时,它的计算量是很大的,因此用伴随矩阵法求逆矩阵是不方便的.下面介绍利用矩阵初等行变换求逆矩阵的方法.在介绍这种方法之前,先给出矩阵初等行变换的定义.) 定义2.13 矩阵的初等行变换是指对矩阵进行下列三种变换: (1) 将矩阵中某两行对换位置; (2) 将某一行遍乘一个非零常数k ; (3) 将矩阵的某一行遍乘一个常数k 加至另一行. 并称(1)为对换变换,称(2)为倍乘变换,称(3)为倍加变换. 矩阵A 经过初等行变换后变为B ,用 A →B 表示,并称矩阵B 与A 是等价的. (下面我们把)第i 行和第j , ”;把第i 行遍乘k k ”;第j 行的k 倍加至第i 为“ + k ”. 例如,矩阵 A = ????? ?????321321321c c c b b b a a a ???? ? ?????321 3 21321 c c c a a a b b b ???? ??????32 1 321321c c c b b b a a a ???? ? ?????32 1321321 kc kc kc b b b a a a ???? ? ?????32 1 321321 c c c b b b a a a ??? ? ? ??? ??+++32 1 332 2113 21 c c c ka b ka b ka b a a a (关于初等矩阵内容请大家自己阅读教材) 二、运用初等行变换求逆矩阵 由定理2.7的推论“任何非奇异矩阵均能经过初等行变换化为单位阵”可知,对于任意一个n 阶可逆矩阵A ,经过一系列的初等行变换可以化为单位阵I ,那么用一系列同样的初等行变换作用到单位阵I 上,就可以把I 化成A -1.因此,我们得到用初等行变换求逆矩阵的方法:在矩阵A 的右边写上一个同阶的单位矩阵I ,构成一个n ?2n 矩阵 ( A , I ),用初等行变换将左半部分的A 化成单位矩阵I ,与此同时,右半部分的I 就被化成了1-A .即 ( A , I )初等行变换 ?→???( I , A -1 ) 例1 设矩阵 A = ???? ? ?????--23 2 311111 ③k ①,② ②+①k

矩阵求逆标准算法

矩阵求逆标准算法(VB)源码 2006-11-29 13:49 类别:默认 本程序依据矩阵初等变换的基本原理编写,算法较为繁琐,但易于理解适合VB初学者。 本程序适合任何(n*n)的矩阵求逆,对于不可逆矩阵有提示信息,并结束程序 本程序在XP,VB6.0下调试通过 本程序由本人原创,请慎用。如有疑问,或调试有误,请联系本人QQ 30360126 本程序可在VB6.0内任何地方用call jzqn(qa(),na()))语句调用其中qa()是输入的矩阵数组,调用此函数后 na()为返回的逆矩阵数组 注意:调用本程序前不要声明na()的维数,仅用dim na()即可。 请不要试图对一个病态矩阵求逆、否则计算结果未必是你想要的病态矩阵是指行列式计算结果极其接近于零的矩阵 Public Sub jzqn(qa(), na()) Dim a() n = UBound(qa, 1) ReDim na(n, n) ReDim a(n, 2 * n) For i = 1 To n For j = 1 To n a(i, j) = qa(i, j)

Next j Next i For i = 1 To n For j = n + 1 To 2 * n If j - i = n Then a(i, j) = 1 Else a(i, j) = 0 End If Next j Next i For i = 1 To n If a(i, i) = 0 Then For q = i To n If a(q, i) <> 0 Then For w = i To 2 * n zj = a(i, w) a(i, w) = a(q, w) a(q, w) = zj Next w Exit For End If Next q If q > n Then MsgBox "此矩阵不可逆": Exit Sub End If

MATLAB教程2012a第3章习题解答 张志涌

第3章 数值阵列及其运算 习题3及解答 1 在MATLAB 中,先运行指令A=magic(3), B=[1,2,1;3,4,3;5,6,7]生成阵列33?A ,33?B ,然后根据运行结果回答以下问题: 〖目的〗 ● 体验矩阵乘法次序不可交换; ● 体验矩阵左除、右除的不同; ● 体验数组乘法次序可交换; ● 体验数组左除、右除的相同性; ● 体验矩阵乘法与数组乘法的根本性差别 ● 体验矩阵求逆的两种方法; ● 体验数组“逆”概念 〖解答〗 A=magic(3), B=[1,2,1;3,4,3;5,6,7] %创建阵列 A = 8 1 6 3 5 7 4 9 2 B = 1 2 1 3 4 3 5 6 7 (1) C1amb=A*B %相乘矩阵的次序不可交换 C1bma=B*A C1amb = 41 56 53 53 68 67 41 56 45 C1bma = 18 20 22 48 50 52 86 98 86 (2) C2adb=A\B %矩阵左除和右除根本不同 C2bda=B/A C2adb = 0.0333 0.1000 0.1611 0.5333 0.6000 0.7444 0.0333 0.1000 -0.1722 C2bda = 0.0056 0.0889 0.1722 0.1389 0.2222 0.3056

0.2333 0.7333 0.2333 (3) C3amb=A.*B %数组乘法不分左、右乘,因为是“元素对元素的运算”C3bma=B.*A C3amb = 8 2 6 9 20 21 20 54 14 C3bma = 8 2 6 9 20 21 20 54 14 (4) C4adb=A.\B %数组除法不分左、右除,因为是“元素对元素的运算”C4bda=B./A C4adb = 0.1250 2.0000 0.1667 1.0000 0.8000 0.4286 1.2500 0.6667 3.5000 C4bda = 0.1250 2.0000 0.1667 1.0000 0.8000 0.4286 1.2500 0.6667 3.5000 (5) C5ada=A\A %相当于inv(A)*A,所以得到“单位阵” C5adda=A.\A %相当于“数组逆”乘数组,得到“单位数组” C5ada = 1 0 0 0 1 0 0 0 1 C5adda = 1 1 1 1 1 1 1 1 1 (6) C6ade=A\eye(3) %矩阵求逆的代数方程法 C6inv=inv(A) %直接利用求逆指令。两者结果相同 C6ade = 0.1472 -0.1444 0.0639 -0.0611 0.0222 0.1056 -0.0194 0.1889 -0.1028 C6inv = 0.1472 -0.1444 0.0639 -0.0611 0.0222 0.1056 -0.0194 0.1889 -0.1028 (7) A C7add1=A.\1 %求“数组逆” C7ade=A\eye(3) %求“矩阵逆” A = 8 1 6 3 5 7 4 9 2 C7add1 = 0.1250 1.0000 0.1667 0.3333 0.2000 0.1429 0.2500 0.1111 0.5000

矩阵求逆方法大全-1

求逆矩阵的若干方法和举例 苏红杏 广西民院计信学院00数本(二)班 [摘 要] 本文详细给出了求逆矩阵的若干方法并给出相应的例子,以供学习有关矩阵方面 的读者参考。 [关键词] 逆矩阵 初等矩阵 伴随矩阵 对角矩阵 矩阵分块 多项式等 引 言 在我们学习《高等代数》时,求一个矩阵的逆矩阵是一个令人十分头痛的问题。但是,在研究矩阵及在以后学习有关数学知识时,求逆矩阵又是一个必不可缺少的知识点。为此,我介绍下面几种求逆矩阵的方法,供大家参考。 定义: n 阶矩阵A 为可逆,如果存在n 阶矩阵B ,使得E BA AB ==,这里E 是n 阶单位矩阵,此时,B 就称为A 的逆矩阵,记为1-A ,即:1-=A B 方法 一. 初等变换法(加边法) 我们知道,n 阶矩阵A 为可逆的充分必要条件是它能表示成一系列初等矩阵的乘积A=m Q Q Q 21, 从而推出可逆矩阵可以经过一系列初等行变换化成单位矩阵。即,必有一系列初等矩阵 m Q Q Q 21使 E A Q Q Q m m =-11 (1) 则1-A =E A Q Q Q m m =-11 (2) 把A ,E 这两个n 阶矩阵凑在一起,做成一个n*2n 阶矩阵(A ,E ),按矩阵的分块乘法,(1)(2)可以合并写成 11Q Q Q m m -(A ,E )=(11Q Q Q m m -,A ,E Q Q Q m m 11 -)=(E ,1-A ) (3) 这样就可以求出矩阵A 的逆矩阵1-A 。 例 1 . 设A= ???? ? ??-012411210 求1-A 。 解:由(3)式初等行变换逐步得到: ????? ??-100012010411001210→ ????? ??-100012001210010411 →???? ? ??----123200124010112001→

n阶矩阵求逆矩阵(C++面向对象)

课程设计报告 实验内容: n阶方阵求逆的实现 相关课程:信息系统开发语言(一) 学期: 2011-2012学年第2学期 学时学分: 68学时 4学分 专业班级:信管1022班 学号: 100312087 姓名:管小芬 指导老师:陈荣元 提交日期: 2012年06月21日

信息系统开发语言(一)课程设计 ——n 阶方阵求逆的实现 一、课程设计目的 1、了解什么是矩阵及逆矩阵。 2、通过VC++6.0编写一个实现求矩阵逆矩阵的程序。 3、巩固和加深学生对算法课程基本知识的理解和掌握。 4、培养利用算法知识解决实际问题的能力。 5、掌握利用程序设计语言进行算法程序的开发、调试、测试. 6、掌握书写算法设计说明文档的能力。 7、提高综合运用算法、程序设计语言、数据结构知识的能力。 二、问题描述 给出任意一个维数大于1小于256的矩阵,通过程序求出其逆矩阵。 如???? ??????=2221 20 1211 10 020100 a a a a a a a a a A ,存在矩阵B ,使得矩阵A 与B 的乘积为单位矩阵,则称矩阵B 为矩阵A 的逆矩阵。 三、问题分析 根据矩阵与逆矩阵的定义,即矩阵A 与矩阵B 相乘等于单位矩阵的思路,编辑程序。 为使问题更加简单明了化,现举除一个具体例子,便于理解,我们在求解数学题

目中,经常会遇到这一类的题目: 如求方阵A 的逆矩阵 ??????????=2221 20 1211 10 020100a a a a a a a a a A 拿到这个题,我们首先应该是理解什么叫矩阵及逆矩阵,我们根据定义可知,一个矩阵如果存在逆矩阵,那么这个矩阵的秩一定不会小于该矩阵的维数,拿到一个题,要求一个逆矩阵的方法是很多的,比较常用的还是先把矩阵化为上三角或者下三角矩阵,,判断矩阵是否存在逆矩阵,然后,然后根据矩阵与逆矩阵之积等于单位矩阵从而得出逆矩阵,这是比较一般的思路,我们一下设计基本上也是以此为基础的。 四、算法分析、设计与描述 1.算法分析和设计 对于矩阵求逆,逆矩阵的定义是:对于n 阶方阵A ,若存在矩阵B ,使得 AB=BA=E ,则称A 为可逆矩阵,简称A 可逆,并称B 为A 的逆矩阵。A 存在逆矩阵的充要条件是|A|≠0。若用定义的方法求解,计算量大,当矩阵的阶数很大时很浪费时间,为了节省时间,通过查阅资料和上网搜索,决定采用高斯-约旦发来进行方阵的求逆操作。 对于矩阵的乘法,利用矩阵乘法定义即可实现,矩阵的乘法的定义是:若A 是一个m*n 阶矩阵,B 是一个n*p 阶矩阵,则AB=C 是一个m*p 阶矩阵,而C 中的每一个(i,j )元都等于A 的第i 行中的各元和B 的第j 列的各对应元之乘积的和。只要按照该定义就可以求出两个矩阵的乘积。 2.算法描述 a.高斯-约旦法求解逆矩阵的算法描述如下:

(完整版)逆矩阵的几种求法与解析(很全很经典)

逆矩阵的几种求法与解析 矩阵是线性代数的主要内容,很多实际问题用矩阵的思想去解既简单又快捷.逆矩阵又是矩阵理论的很重要的内容, 逆矩阵的求法自然也就成为线性代数研究的主要内容之一.本文将给出几种求逆矩阵的方法. 1.利用定义求逆矩阵 定义: 设A 、B 都是n 阶方阵, 如果存在n 阶方阵B 使得AB= BA = E, 则称A 为可逆矩阵, 而称B 为A 的逆矩阵.下面举例说明这种方法的应用. 例1 求证: 如果方阵A 满足A k= 0, 那么EA 是可逆矩阵, 且 (E-A )1-= E + A + A 2+…+A 1-K 证明 因为E 与A 可以交换, 所以 (E- A )(E+A + A 2+…+ A 1-K )= E-A K , 因A K = 0 ,于是得 (E-A)(E+A+A 2+…+A 1-K )=E , 同理可得(E + A + A 2+…+A 1-K )(E-A)=E , 因此E-A 是可逆矩阵,且 (E-A)1-= E + A + A 2+…+A 1-K . 同理可以证明(E+ A)也可逆,且 (E+ A)1-= E -A + A 2+…+(-1)1-K A 1-K . 由此可知, 只要满足A K =0,就可以利用此题求出一类矩阵E ±A 的逆矩阵. 例2 设 A =? ? ?? ? ???? ???0000 30000020 0010,求 E-A 的逆矩阵. 分析 由于A 中有许多元素为零, 考虑A K 是否为零矩阵, 若为零矩阵, 则可以采用例2 的方法求E-A 的逆矩阵. 解 容易验证

A 2 =????????? ???0000000060000200, A 3=? ? ?? ? ? ? ?? ???00000000 00006000 , A 4=0 而 (E-A)(E+A+ A 2+ A 3)=E,所以 (E-A)1-= E+A+ A 2+ A 3= ? ? ?? ? ???????1000 31006210 6211. 2.初等变换法 求元素为具体数字的矩阵的逆矩阵,常用初等变换法.如果A 可逆,则A 可通过初等变换,化为单位矩阵I ,即存在初等矩阵S P P P ,,21Λ使 (1)s p p p Λ21A=I ,用A 1-右乘上式两端,得: (2) s p p p Λ21I= A 1- 比较(1)(2)两式,可以看到当A 通过初等变换化为单位矩阵的同时,对单位矩阵I 作同样的初等变换,就化为A 的逆矩阵A 1-. 用矩阵表示(A I )??? →?初等行变换 为(I A 1-),就是求逆矩阵的初等行变换法,它是实际应用中比较简单的一种方法.需要注意的是,在作初等变换时只允许作行初等变换.同样,只用列初等变换也可以求逆矩阵. 例1 求矩阵A 的逆矩阵.已知A=???? ? ?????521310132. 解 [A I]→??????????100521010310001132→???? ? ?????001132010310100521 → ??????????--3/16/16/1100010310100521→???? ??????-----3/16/16/110012/32/10103/46/136/1001

矩阵及逆矩阵的求法

矩阵的可逆性与逆矩阵的求法 目录 摘要 (1) 第1章.矩阵 (2) 1.1矩阵的定义 (2) 1.2矩阵的运算 (2) 第2章.矩阵的可逆性及逆矩阵 (5) 2.1矩阵的基本概念 (5) 2.2矩阵可逆的判断方法 (6) 2.3矩阵可逆性的求法 (10) 第3章.逆矩阵的拓展 (17) 3.1广义逆矩阵的引入 (17) 3.2广义逆矩阵的定义及存在 (17) 第4章.总结 (21) 参考文献 (22) 致谢 (23) 附件:论文英文简介

矩阵的可逆性与逆矩阵的求法 [摘要]:矩阵理论是现代代数学的重要分支理论之一,它也为现代科技及现代经济理论研究提供不可或缺的数学支持。在线性代数研究中引入矩阵的目的之一就是为了研究线性方程组B AX 求解及更一般的矩阵方程求解提供数学工具,其中矩阵的可逆性及逆矩阵的求法是最主要的内容。本文从矩阵的基本概念及运算入手,主要探讨和归纳矩阵可逆性的四种判定方法和求逆矩阵的五种方法,并引进Matlab这一数学软件求逆矩阵的程序,同时关注广义逆矩阵意义及求法。 [关键词]:矩阵可逆性逆矩阵广义逆求法

矩阵可逆性的判断和可逆矩阵的求法是矩阵理论学习的重点与难点,也是研究矩阵性质及运算中必不可少的一部分。本文在分析和归纳判断矩阵的可逆性和逆矩阵的求法,给出了四种判断矩阵可逆的方法,其中有初等矩阵的应用,有行列式的应用,还有向量的线性无关和线性方程组的应用。逆矩阵的求法给出了五种方法:分别是行变换、列变换、伴随矩阵、分块矩阵法以及Matlab 软件的解法,同时也讨论了广义逆矩阵的求法。对矩阵可逆性的判断与逆矩阵的求法将会给矩阵的学习带来很大的帮助。 第1章 矩 阵 1.1矩阵的定义 定义1 由st 个数ij c 排成一个s 行t 列的表 ???? ?? ? ??st s s t t c c c c c c c c c 2 1 2222111211 叫作一个s 行t 列(或t s ?)矩阵,ij c 叫作这个矩阵的元素。 定义2 矩阵的行(列)初等变换指的是对一个矩阵施行的下列变换: )(i 交换矩阵的两行(列); )(ii 用一个不等于零的数乘矩阵的某一行(列),即用一个不等于零的数乘矩阵的某一行(列)的元素; )(iii 用某一数乘矩阵的某一行(列)后加到另一行(列),即用某一数乘矩阵的某一行(列)的每一元素后加到另一行(列)的对应元素上。 矩阵的初等变换在线性方程组求解,求矩阵的秩及求矩阵的逆矩阵方面都有重要的作用。 1.2矩阵运算 定义1 数域F 的数a 与F 上一个n m ?矩阵)(ij a A =的乘积aA 指的是n m ?矩阵 )(ij aa ,求数与矩阵的乘积的运算叫作数与矩阵的乘法。 定义2 两个n m ?矩阵)(),(ij ij b B a A ==的和B A +指的是n m ?矩阵)(ij ij b a +,求两

总结求逆矩阵方法

总结求逆矩阵方法 直接算会死人的。根据矩阵特点用不用的分解,写成几个例程,每次实验之前进行尝试,根据尝试结果在算法里决定里决定用哪个。 irst 我想问: 1.全阶矩阵A的求逆运算inv(A) 和稀疏矩阵B(阶数和a一样) 的求逆运算inv(B)是不是采取一样的方法啊?也就是说他们的 计算量是不是一样的啊?不会因为是稀疏矩阵就采取特殊的 方法来处理求逆吧? 我电脑内存256M ,做4096*4096的矩阵求逆还可以,上万阶的 就跑不动了 稀疏存储方式会减少不必要的计算,虽然原理还是一样,不过 计算量大大减少了。 2.如果一个矩阵C非零元素都集中在主对角线的周围,那么对C求逆最好 应该采用什么样的方法最好呢? 一般还是用LU分解+前后迭代的方法,如果矩阵对角占优就更好办了。 只不过还是需要稀疏存储。 稀疏矩阵的逆一般不会是稀疏矩阵,所以对高阶的稀疏矩阵求逆, 是不可行的,对1万阶的全矩阵需要的内存差不多已经达到了pc的 极限,我想最好的办法就是迭代,既然是稀疏,乘法的次数就有限, 效率还是很高的。 不过求逆运算基本上就是解方程,对稀疏矩阵,特别是他那种基本上非零元素都在对角线附近的矩阵来说,LU分解不会产生很多的注入元,所以用LU分解解方程方法的方法是可行的。 如果用迭代法,好像也就是共轭梯度法了。 C的资源网络上有很多google一下 或者到https://www.doczj.com/doc/52188871.html,,https://www.doczj.com/doc/52188871.html,上找找 或者用IMSL for C 或者用Lapack 或者用Matlab+C混合编程 有现成代码,但要你自己找了

也可以使用程序库 second 30,000*30,000的稀疏矩阵求逆如何实现? 试试基于krylov子空间方法的算法吧。 如arnoldi和GMRES方法。 matlab中有函数可以直接调用。 直接help gmres就可以了。 如果效果还不好。 就用用预处理技术。 比如不完全lu预处理方法。。等等。。 各种各样的预处理+GMRES是现在解决大规模稀疏矩阵的主力方法。。 维数再多还是用不完全LU分解预处理+CG or Gmres 我一个同学这么求过200W阶的矩阵 求逆一般是不可取的,无需多说。但稀疏矩阵的直接解法还是不少的。基本上都是对矩阵进行重新排序以期减少填充或运算量。 在matlab里面,有许多算法可以利用: colamd, colmmd, colperm, spparms, symamd, symmmd, symrcm. 根据是否对称,采用LU分解或者chol分解。 这些算法在internet上搜一下,很多都有相应的C或fortran版本。 稀疏矩阵的存储最常见的是压缩列(行)存储,最近发现一种利用hash表来存储的,其存取复杂度是O(1),很是不错。有幸趣的可以看看下面网页咯,作者提供了源程序。 事实上Hash表存储的效率也跟Hash算法有关,弄不好的话,不见得比直接按行或者列 顺序检索快。而且规模越大,效率肯定越来越低。 https://www.doczj.com/doc/52188871.html,rmatik.hs-bremen.de/~brey/ 对称正定的稀疏矩阵很好办啊,用LU分解就可以了。 如果维数实在太大,比如超过10^4量级,那就只能用 共轭梯度法之类的迭代法求解了。

差分码ASK信号抽样仿真

长沙理工大学 《通信原理》课程设计报告 李秉坤 学 院 城南学院 专 业 通信工程 班 级 通信1104 学 号 201185250429 学生姓名 李秉坤 指导教师 黄红兵 课程成绩 完成日期 2014年1月9日

课程设计成绩评定 学院城南学院专业通信工程 班级通信1104 学号20118525042 学生姓名李秉坤指导教师黄红兵 课程成绩完成日期2014年1月9日指导教师对学生在课程设计中的评价 指导教师对课程设计的评定意见

课程设计任务书 城南学院通信工程专业

差分码ASK信号PAM调制仿真 学生姓名:李秉坤指导老师:黄红兵 摘要本课程设计主要用matlab/Simulink平台仿真一个差分码ASK信号抽样仿真系统,利用图形输入法设计相关电路,用示波器和频谱模块分析系统性能。首先根据原理画出图形,构建调制解调电路,在Simulink中调出各模块组成电路,设置调制解调电路各模块的参数值并运行,把运行仿真结果输入显示器,根据显示结果分析所设计的系统性能。通过波形分析,达到仿真的目的。 关键词抽样仿真;差分码;Matlab/Simulink 1 引言 MATLAB的名称源自Matrix Laboratory,它是一种科学计算软件,专门以矩阵的形式处理数据[1]。MATLAB将高性能的数值计算和可视化集成在一起,并提供了大量的内置函数,从而被广泛地应用于科学计算、控制系统、信息处理等领域的分析、仿真和设计工作。本课程设计主要用matlab中的Simulink平台仿真一个差分码ASK信号抽样仿真系统分别在理想信道和非理想信道中运行,并把运行仿真结果输入显示器,根据显示结果分析所设计的系统性能。 1.1 课程设计目的 通信原理课程设计是《通信原理》理论课程的辅助实践环节。着重体现学生对通信原理教学知识的应用,培养学生理论与实际工程相结合的能力。以小课题的方式来加深、扩展通信原理知识[3]。通过设计差分码ASK信号抽样仿真系统,并使其在不同的噪声信道中运行,让学生进一步理解通信系统的基本组成、模拟通信和数字通信的基础理论、通信系统发射端信号的形成原理、通信系统信号传输质量的检测等方面的相关知识,并学会运用这些知识。 1.2 课程设计的步骤 学习MATLAB的基本知识,熟悉MATLAB集成环境下的Simulink仿真平台。 利用通信原理中所学到的相关知识,在Simulink仿真平台中设计差分码ASK信号

LMS算法

N=31; % 滤波器阶数 sample_N=500; % 总采样次数 d=sin(2*pi*0.02* [0:sample_N-1]); % 期望的输入信号figure ; % 滤波器的权值矩阵 subplot(2,1,1); plot(d,'r'); grid on; xlabel('样本'); ylabel('幅值'); title('自适应滤波器的理想输入'); x=awgn(d,10); % 经过信道加入高斯噪声信噪比为10dB M=length(d); % 接受信号长度 wn=randn(M,1); hn=zeros(N,1); rxx=zeros(N,N); rxd=zeros(1,N); y=zeros(M,1); xt=zeros(M+N,1); % 生成输入信号与理想信号的互相关矩阵 for i=1:N, for m=i:1:M, rxd(1,i)=rxd(1,i)+x(1,m)*d(1,m-i+1); end end % 生成输入信号的自相关矩阵 for i=1:N, for m=i:1:M, rxx(1,i)=rxx(1,i)+x(1,m)*x(1,m-i+1); end end for i=2:N, for m=2:N,

rxx(i,m)=rxx(i-1,m-1); end end rxt=rxx'; for i=1:N rxt(i,i)=0; end rxx=rxx+rxt; irxx=inv(rxx); % RLS算法 randn('seed', 0) ; rand('seed', 0) ; NoOfData = 8000 ; % Set no of data points used for training Order = 32 ; % 自适应滤波权数 Lambda = 0.98 ; % 遗忘因子 Delta = 0.001 ; % 相关矩阵R的初始化 x = randn(NoOfData, 1) ;%高斯随机系列 h = rand(Order, 1) ; % 系统随机抽样 d = filter(h, 1, x) ; % 期望输出 % RLS算法的初始化 P = Delta * eye ( Order, Order ) ;%相关矩阵 w = zeros ( Order, 1 ) ;%滤波系数矢量的初始化 % RLS Adaptation for n = Order : NoOfData ; u = x(n:-1:n-Order+1) ;%延时函数 pi_ = u' * P ;%互相关函数 k = Lambda + pi_ * u ; K = pi_'/k;%增益矢量 e(n) = d(n) - w' * u ;%误差函数 w = w + K * e(n) ;%递归公式 PPrime = K * pi_ ; P = ( P - PPrime ) / Lambda ;%误差相关矩阵

相关主题
文本预览
相关文档 最新文档