簡體   English   中英

規范,歸一化和歸一化的區別

[英]Difference between norm, normalize and normalized in eigen

假設我有一個名為AMatrixXcf 我想用相對於相應列的標准化元素替換每列的元素。 我寫過以下代碼,但事實並非如此!

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();

其次:

  1. normalize - 將編譯時已知向量(如在編譯時已知為向量的向量中)標准化,不返回任何內容。
  2. normalized - 返回上面的構造副本,不會影響類。 您可以使用它來分配 - Vector normCopy = vect.normalized()
  3. 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM