[英]Difference between norm, normalize and normalized in eigen
假設我有一個名為A
的MatrixXcf
。 我想用相對於相應列的標准化元素替換每列的元素。 我寫過以下代碼,但事實並非如此!
for (int i = 0; i < A.cols(); i++)
A.col(i).real.array() = A.col(i).real().array()/A.col(i).real().norm();
另一個問題,在Eigen
norm()
, normalize()
和normalized()
之間有什么區別?
首先,您可以使用normalize進行normalize
,因此您的代碼應該是:
for (int i = 0; i < A.cols(); i++)
A.col(i).normalize();
其次:
normalize
- 將編譯時已知向量(如在編譯時已知為向量的向量中)標准化,不返回任何內容。 normalized
- 返回上面的構造副本,不會影響類。 您可以使用它來分配 - Vector normCopy = vect.normalized()
。 norm
- 返回矩陣的范數值 。 即,所有矩陣條目的平方和的平方根。 所以區別在於,每個函數為您返回的是什么。
您可以在手冊中找到問題的答案。 綜上所述:
norm()
是Frobenius范數 ,即組件平方和的平方根。
.normalized()
將副本返回到原始對象除以此范數(即原始對象未更改)。
.normalize()
按此規范就地分割對象(即原始對象本身被修改)。
通過這個例子,你可以說服自己:
#include <Eigen/Eigen>
#include <iostream>
int main()
{
Eigen::VectorXd A(3);
A(0) = 1.;
A(1) = 2.;
A(2) = 3.;
std::cout << "A.norm() = " << std::endl;
std::cout << A.norm() << std::endl;
Eigen::VectorXd B = A.normalized();
std::cout << "B = " << std::endl;
std::cout << B << std::endl;
std::cout << "A = " << std::endl;
std::cout << A << std::endl;
A.normalize();
std::cout << "A = " << std::endl;
std::cout << A << std::endl;
}
我編譯:
clang++ `pkg-config --cflags eigen3` so.cpp
但這因系統而異。
輸出:
A.norm() =
3.74166
B =
0.267261
0.534522
0.801784
A =
1
2
3
A =
0.267261
0.534522
0.801784
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.