[英]Multiple Eigen::Matrix initializations with OMP: segmentation faults
[英]What do the different Initializations of Eigen::RowVectorXf do?
我正在閱讀一些文檔,發現兩個不同的初始化和new
與Eigen::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>;
其中Type
是float
(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.