簡體   English   中英

Eigen::RowVectorXf 的不同初始化有什么作用?

[英]What do the different Initializations of Eigen::RowVectorXf do?

我正在閱讀一些文檔,發現兩個不同的初始化和newEigen::RowVectorXf的用法。 我無法通過文檔找到有什么區別,甚至無法找到這種可能性,並希望得到一些澄清。

這是第一個版本:

std::vector<Eigen::RowVectorXf*> V;
std::vector<float> data = {0,1,2,3,4};


V.push_back(new Eigen::RowVectorXf(5));

for (int i = 0; i<5; i++)
     V[0]->coeffRef(1, i) = data[i];

這是第二個版本:

std::vector<Eigen::RowVectorXf*> V;
std::vector<float> data = {0,1,2,3,4};


V.push_back(new Eigen::RowVectorXf(1, 5));

for (int i = 0; i<5; i++)
     V[0]->coeffRef(i) = data[i];

我在文檔中找不到對此的任何引用,而且我不認為它們應該有所不同——這只是一個已棄用的訪問功能嗎? 如果有人可以從數學上概述這兩種情況下會發生什么,並讓我知道兩者是否只是創建具有 5 列的一維向量並填充它,我將非常感激。 謝謝!

根據我在Martix.h中看到的內容, RowVectorXf是矩陣的別名

using RowVector##SizeSuffix = Matrix<Type, 1, Size>;

其中Typefloat (f 后綴) 並且Size on 2nd 維度是Dynamic

在這兩種情況下,您都在創建相同的東西。 因為此 Vector 只是 Matrix with 1 Row 的別名,所以使用您希望矩陣具有的 2 arg 構造函數是合法的。 我相信如果您將 1 以外的任何內容作為第一個參數傳遞,您會收到運行時錯誤(Matrix 構造函數調用Base::_check_template_params(); ,沒有深入研究這個,但它似乎是一個運行時參數驗證器) .

總結一下:這兩種情況似乎都做同樣的事情,但我是基於對源代碼的分析——我對 Eigen 文檔沒有豐富的經驗。

是的, Eigen::RowVectorXf(5)Eigen::RowVectorXf(1, 5)都聲明了一個 1x5 行向量。

兩個構造函數都沒有被棄用。 澄清一下, RowVectorXf只是Matrix<float, 1, Dynamic>的類型定義,即具有 1 行的浮點值矩陣。 Eigen::Matrix 文檔中所列,Matrix(以及 RowVectorXf)有多個構造函數:

  • Matrix(Index dim)構造函數生成大小為dim的行或列向量。 為在編譯時不知道有一行或一列的 Matrix 類型調用此構造函數是編譯錯誤。

  • Matrix(Index rows, Index cols)構造函數通過cols創建一個大小為rows的矩陣,並且對任何 Matrix 類型都有效,包括 RowVectorXf。 如您所料,如果為 RowVectorXf 調用這種形式的構造函數,則在運行時會斷言rows為 1。

是的, Matrix(Index dim)構造函數對 RowVectorXf 更有用。 但是在通用代碼中可以很方便地使用兩個參數的構造函數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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