[1]norm()
https://www.zhihu.com/question/29458275
n=norm(A,p) 功能:norm函数可计算几种不同类型的矩阵范数,根据p的不同可得到不同的范数。
-
如果A为矩阵
n=norm(A) ---返回A的最大奇异值,即max(svd(A))
n=norm(A,p) ---根据p的不同,返回不同的值
p值 | 返回值 |
1 | 返回A中最大一列和,即max(sum(abs(A))) |
2 | 返回A的最大奇异值,和n=norm(A)用法一样 |
inf | 返回A中最大一行和,即max(sum(abs(A’))) |
‘fro’ | A和A‘的积的对角线和的平方根,即sqrt(sum(diag(A'*A))) |
-
如果A为向量
norm(A,p)---返回向量A的p范数。即返回 sum(abs(A).^p)^(1/p),对任意 1<p<+∞.
norm(A)---返回向量A的2范数,即等价于norm(A,2)。
norm(A,inf) ---返回max(abs(A))
norm(A,-inf) ---返回min(abs(A))
norm(A)---返回向量A的2范数,即等价于norm(A,2)。
norm(A,inf) ---返回max(abs(A))
norm(A,-inf) ---返回min(abs(A))
x = [0 1 2 3] x = 0 1 2 3 sqrt(0+1+4+9) % Euclidean length ans = 3.7417 norm(x) ans = 3.7417 n = length(x) % Number of elements n = 4 rms = 3.7417/2 % rms = norm(x)/sqrt(n) rms = 1.8708
[2]noalias() 声明没有混淆
在Eigen中,当变量同时出现在左值和右值,赋值操作可能会带来混淆问题.
MatrixXi mat(3,3); mat << 1, 2, 3, 4, 5, 6, 7, 8, 9; cout << "Here is the matrix mat:\n" << mat << endl; // This assignment shows the aliasing problem mat.bottomRightCorner(2,2) = mat.topLeftCorner(2,2); cout << "After the assignment, mat = \n" << mat << endl;
输出 Here is the matrix mat: 1 2 3 4 5 6 7 8 9 After the assignment, mat = 1 2 3 4 1 2 7 4 1
//原因是Eigen使用了lazy evaluation(懒惰评估).
组件级是指整体的操作,比如matrix加法、scalar乘、array乘等,这类操作是安全的,不会出现混淆。
在Eigen中,矩阵的乘法一般都会出现混淆,除非是方阵(实质是元素级的乘)。Eigen默认会解决混淆问题,如果你确定不会出现混淆,可以使用noalias()来提效,使用noalias()函数来声明这里没有混淆。
混淆出现时,可以用eval()和xxxInPlace()函数解决。
MatrixXi mat(3,3); mat << 1, 2, 3, 4, 5, 6, 7, 8, 9; cout << "Here is the matrix mat:\n" << mat << endl; // The eval() solves the aliasing problem mat.bottomRightCorner(2,2) = mat.topLeftCorner(2,2).eval(); cout << "After the assignment, mat = \n" << mat << endl; 输出 Here is the matrix mat: 1 2 3 4 5 6 7 8 9 After the assignment, mat = 1 2 3 4 1 2 7 4 5
同样: a = a.transpose().eval();
当然我们最好使用 transposeInPlace()。如果存在xxxInPlace函数,推荐使用这类函数,它们更加清晰地标明了你在做什么。提供的这类函数:
Origin | In-place |
---|---|
MatrixBase::adjoint() 共轭 |
MatrixBase::adjointInPlace() |
DenseBase::reverse() 逆 |
DenseBase::reverseInPlace() |
LDLT::solve() | LDLT::solveInPlace() |
LLT::solve() | LLT::solveInPlace() |
TriangularView::solve() | TriangularView::solveInPlace() |
DenseBase::transpose() 转置 |
DenseBase::transposeInPlace() |