定义一个矩阵A=[-1 2 -3;4 -6 6]。
矩阵的1范数 :矩阵的每一列上的元素绝对值先求和,再从中取个最大的,(列和最大),上述矩阵A的1范数先得到[5,8,9],再取最大的最终结果就是:9。
矩阵的2范数 :矩阵 A 的最大特征值开平方根,上述矩阵A的2范数得到的最大结果是:100623。
矩阵的无穷范数 :矩阵的每一行上的元素绝对值先求和,再从中取个最大的,(行和最大),上述矩阵A的1范数先得到[6;16],再取最大的最终结果就是:16。
矩阵的核范数 :矩阵的奇异值(将矩阵svd分解)之和,这个范数可以用来低秩表示(因为最小化核范数,相当于最小化矩阵的秩--低秩),上述矩阵A的最终结果就是109287。
矩阵的L0范数 :矩阵的非0元素的个数,通常用它来表示稀疏,L0范数越小0元素越多,也就越稀疏,上述矩阵A最终结果就是:6。
矩阵的L1范数 :矩阵中的每个元素绝对值之和,它是L0范数的最优凸近似,因此它也可以表示稀疏,上述矩阵A最终结果就是:22。
矩阵的F范数 :矩阵的各个元素平方之和再开平方根,它通常也叫做矩阵的L2范数,它的优点在它是一个凸函数,可以求导求解,易于计算,上述矩阵A最终结果就是100995。
矩阵的L21范数 :矩阵先以每一列为单位,求每一列的F范数(也可认为是向量的2范数),然后再将得到的结果求L1范数(也可以认为是向量的1范数),很容易看出它是介于L1和L2之间的一种范数,上述矩阵A最终结果就是:171559。
摘抄自: >方法/步骤分步阅读
(1)在求矩阵的范数之前,我们首先要清楚我们要求得是那一类矩阵范数,通常我们常用的矩阵范数可以分为:1范数,2范数,无穷范数,和Frobenius范数。
(2)上面介绍了几种常用的范数表示形式了,那么下面来看下怎么求具体的范数值。当然,我们可以根据定义来求每个范数的值,这样只针对于矩阵维度较小的矩阵适用,下面我们来看下当矩阵维数较大时我们怎么通过matlab来求矩阵的不同范数。
(3)首先,我们来看下矩阵的1范数怎么通过matlab来求。
先在matlab命令窗口中生成一个希尔伯特矩阵a=hilb(4),然后,在命令窗口中输入nm1=norm(a,1) ,其中norm就是求矩阵范数的函数,1表示的是1范数。程序运行结果如下图所示,显然红色圈中部分就是所求的结果对应的列。
(4)其次,看下怎么求矩阵的2范数。
先在matlab命令窗口中生成一个希尔伯特矩阵a=hilb(4),然后,在命令窗口中输入nm2=norm(a,2) ,其中norm就是求矩阵范数的函数,2表示的是2范数。程序运行结果如下图所示,当然这里不能向1范数那样,一眼看出结果。
(5)下面看下怎么求矩阵的无穷范数。(相信聪明的同学已经想到了)
先在matlab命令窗口中生成一个希尔伯特矩阵a=hilb(4),然后,在命令窗口中输入nm3=norm(a,inf) ,其中norm就是求矩阵范数的函数,inf表示的是无穷范数。程序运行结果如下图所示。
(6)最后我们看下怎么求矩阵的Frobenius范数。
先在matlab命令窗口中生成一个希尔伯特矩阵a=hilb(4),然后,在命令窗口中输入nm4=norm(a,'for') ,其中norm就是求矩阵范数的函数,for表示的是Frobenius范数,就是前三个字母嘛。程序运行结果如下图所示。
至此几种常用的矩阵范数都求出来了,大家可以试试了!
Proof of 1):
不等式左边:存在向量x,使得norm1(A) = norm1(Ax) / norm1(x),那么有
norm1(A) / sqrt(m) = [norm1(Ax) / sqrt(m)] / norm1(x) <= norm2(Ax) / norm1(x) = [norm2(Ax) / norm2(x)] [norm2(x) / norm1(x)] <= norm2(Ax) / norm2(x) <= norm2(A),证毕。
不等式右边:存在向量y,使得norm2(A) = norm2(Ay) / norm2(y),那么有
norm2(A) = norm2(Ay) / norm2(y) <= norm1(Ay) / norm2(y) = [norm1(Ay) / norm1(y)] [norm1(y) / norm2(y)] <= [norm1(Ay) / norm1(y)] sqrt(n) <= sqrt(n) norm1(A),证毕。
Proof of 2):
记第i行、第j列元素aij为A中最大绝对值元素;A = [A1; A2; A3; ; An],Ai为A的第i列,则有
不等式左边:存在向量x = [0, ,0 ,1 , 0, ,0]'满足除第j个元素为1,其他元素为0,那么有
aij = normi(Ax) <= norm2(Ax) / norm2(x) <= norm2(A),证毕。
不等式右边:存在向量y,使得norm2(A) = norm2(Ay) / norm2(y),那么有
norm2(A) = norm2(Ay) / norm2(y) <= norm2(Ay) sqrt(n) / norm1(y) <= sqrt(m) normi(Ay) sqrt(n) / norm1(y) = sqrt(mn) normi(Ay) / norm1(y) <= sqrt(mn) [normi(y1A1) + + normi(ynAn)] / norm1(y) <= sqrt(mn) [y1normi(Aj) + y2normi(Aj) + + ynnormi(Aj)] / norm1(y) = sqrt(mn) normi(Aj) = sqrt(mn) aij,证毕。矩阵A的2范数就是 A的转置乘以A矩阵特征根 最大值的开根号
如A={ 1 -2
-3 4 }
那么A的2范数就是(15+221^1/2)^1/2 了
程序如下:
#include "stdioh"
#include "mathh"
#define N 20
main()
{
int i,j,k; int size,max; int a[N][N],b[N][N],c[N][N],d[N][N];
int s; int S[N],M[N]; float l;
printf("请输入方正的n:"); scanf("%d",&size);
printf("\n");
printf("请输入矩阵:\n");
for(i=0;i<size;i++) {
for(j=0;j<size;j++) {
scanf("%d",&a[i][j]);
}
}
printf("%d%d的阶方阵A为:\n",size,size);
for(i=0;i<size;i++)
{
for(j=0;j<size;j++){
printf("%d ",a[i][j]);
}
printf("\n");
}
printf("\n");
for(j=0;j<size;j++){
s=0;
for(i=0;i<size;i++){
s=s+abs(a[i][j]);
}
S[j]=s;
}
printf("\n");
for(i=0;i<size;i++) {
for(j=0;j<size;j++) {
b[i][j]=a[j][i];
}
}
for(k=0;k<size;k++) {
for(i=0;i<size;i++) {
s=0;
for(j=0;j<size;j++) {
s=s+a[j][i]b[k][j];
}
d[k][i]=s;
}
}
s=0;
for(i=0;i<size;i++)
for(j=0;j<size;j++)
s=s+a[i][j]a[i][j];
l=sqrt(s); printf("2范数为:%f\n",l);
printf("\n");
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)