Eigen教程(10)

整理下Eigen庫的教程,參考:http://eigen.tuxfamily.org/dox/index.html

混淆

在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

mat.bottomRightCorner(2,2) = mat.topLeftCorner(2,2); 賦值中展示了混淆。

mat(1,1) 在bottomRightCorner(2,2)和topLeftCorner(2,2)都存在。賦值結果中mat(2,2)本應該賦予操作前mat(1,1)的值=5。但是,最終程序結果mat(2,2)=1。原因是Eigen使用了lazy evaluation(懶惰評估),上面等價于

mat(1,1) = mat(0,0);
mat(1,2) = mat(0,1);
mat(2,1) = mat(1,0);
mat(2,2) = mat(1,1);

下面會解釋如何通過eval()來解決這個問題。

混淆還會在縮小矩陣時出現,比如 vec = vec.head(n)mat = mat.block(i,j,r,c)

一般來說,混淆在編譯階段很難被檢測到。比如第一個例子,如果mat再大一些可能就不會出現混淆了。但是Eigen可以在運行時檢測某些混淆,如前面講的例子。

Matrix2i a; a << 1, 2, 3, 4;
cout << "Here is the matrix a:\n" << a << endl;
a = a.transpose(); // !!! do NOT do this !!!
cout << "and the result of the aliasing effect:\n" << a << endl;
Here is the matrix a:
1 2
3 4
and the result of the aliasing effect:
1 2
2 4

我們可以通過EIGEN_NO_DEBUG宏,在編譯時關閉運行時的斷言。

解決混淆問題

Eigen需要把右值賦值為一個臨時matrix/array,然后再將臨時值賦值給左值,便可以解決混淆。eval()函數實現了這個功能。

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函數,推薦使用這類函數,它們更加清晰地標明了你在做什么。提供的這類函數:

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

而針對vec = vec.head(n)這種情況,推薦使用conservativeResize()

混淆和component級的操作。

組件級是指整體的操作,比如matrix加法、scalar乘、array乘等,這類操作是安全的,不會出現混淆。

MatrixXf mat(2,2); 
mat << 1, 2,  4, 7;
cout << "Here is the matrix mat:\n" << mat << endl << endl;
mat = 2 * mat;
cout << "After 'mat = 2 * mat', mat = \n" << mat << endl << endl;
mat = mat - MatrixXf::Identity(2,2);
cout << "After the subtraction, it becomes\n" << mat << endl << endl;
ArrayXXf arr = mat;
arr = arr.square();
cout << "After squaring, it becomes\n" << arr << endl << endl;

輸出

Here is the matrix mat:
1 2
4 7After 'mat = 2 * mat', mat = 2  48 14After the subtraction, it becomes1  48 13After squaring, it becomes1  1664 169

混淆和矩陣的乘法

在Eigen中,矩陣的乘法一般都會出現混淆。除非是方陣(實質是元素級的乘)。

MatrixXf matA(2,2); 
matA << 2, 0,  0, 2;
matA = matA * matA;
cout << matA;4 0
0 4

其他的操作,Eigen默認都是存在混淆的。所以Eigen對矩陣乘法自動引入了臨時變量,對的matA=matA*matA這是必須的,但是對matB=matA*matA這樣便是不必要的了。我們可以使用noalias()函數來聲明這里沒有混淆,matA*matA的結果可以直接賦值為matB。

matB.noalias() = matA * matA;

從Eigen3.3開始,如果目標矩陣resize且結果不直接賦值給目標矩陣,默認不存在混淆。

MatrixXf A(2,2), B(3,2);
B << 2, 0,  0, 3, 1, 1;
A << 2, 0, 0, -2;
A = (B * A).cwiseAbs();//cwiseAbs()不直接賦給目標
//A = (B * A).eval().cwiseAbs()
cout << A;

當然,對于任何混淆問題,都可以通過matA=(matB*matA).eval() 來解決。

總結

當相同的矩陣或array在等式左右都出現時,很容易出現混淆。

  1. compnent級別的操作不用考慮混淆。
  2. 矩陣相乘,Eigen默認會解決混淆問題,如果你確定不會出現混淆,可以使用noalias()來提效。
  3. 混淆出現時,可以用eval()和xxxInPlace()函數解決。

轉載于:https://www.cnblogs.com/houkai/p/6349990.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/371612.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/371612.shtml
英文地址,請注明出處:http://en.pswp.cn/news/371612.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

matlab把符號數,Matlab?符號與數值之間的轉換

符號運算得到的是精確的解析解&#xff0c;但是有時需要進行數值轉換&#xff0c;主要通過以下幾個函數實現。1.digits 函數調用方法&#xff1a;digits(D)函數設置有效數字個數為D的近似解精度。2.vpa 函數vpaVariable-precision arithmeticSyntaxR vpa(A)R vpa(A,d)Descrip…

JSF組件庫–質量不只是零缺陷

自從我上次研究三個主要JSF組件庫的質量以來&#xff0c;已經有一段時間了。 2009年12月&#xff0c;我開始比較RichFaces&#xff0c;Primefaces和ICEfaces的整體軟件質量 。 從那時起&#xff0c;事情發生了變化&#xff0c;從現在開始&#xff0c;我想重新評估和更新它。 我…

[API檔案]GetDlgItem

函數功能 用于獲取指定對話框函數控件的句柄。 API函數原型 1 HWND WINAPI GetDlgItem( 2 _In_opt_ HWND hDlg, //指向包含該對話框的句柄 3 _In_ int nIDDlgItem //第二個參數是控件的名稱 4 ); 范例 可參見ComboBox_AddString宏的范例【點擊這里】轉載于:ht…

嵌入式實時系統的任務設計

嵌入式實時系統的任務設計主要為任務函數的設計、任務優先級的安排、任務的數據結構設計&#xff0c;任務之間的同步與通信設計。 一&#xff0e;任務函數的設計 任務函數按任務結構可分為單次執行任務、周期執行任務和事件觸發任務&#xff0c;各任務的主要差異點如下&#xf…

mssql php 5.4,PHP5.4如何連接MSSql Server2005

windows系統下&#xff0c;PHP5.3以上的版本已經不支持mssql擴展&#xff0c;所以如果你需要和sql server通信需要到http://msdn.microsoft.com/en-us/sqlserver/ff657782.aspx自行下載微軟提供的The SQL Server Driver for PHP。下載后解壓縮&#xff0c;將所有的.dll文件拷貝…

將原生SQL功能休眠到您的Spring Data Repository中

JPA為您提供NamedNativeQuery以便使用本機SQL。 但是&#xff0c;用法不是很方便&#xff0c;尤其是當您需要在本機SQL中映射多個實體時。 您必須定義一組容易出錯的SqlResultSetMapping映射。 對于以前使用過Hibernate本機SQL功能的用戶&#xff0c;您會發現它比JPA的NamedNat…

創建yii的第一個應用

原文鏈接轉載于:https://www.cnblogs.com/Baronboy/p/6354522.html

字符串匹配(KMP 算法 含代碼)

主要是針對字符串的匹配算法進行解說 有關字符串的基本知識傳統的串匹配法模式匹配的一種改進算法KMP算法網上一比較易懂的解說小樣例1計算next 2計算nextval代碼有關字符串的基本知識 串&#xff08;string或字符串&#xff09;是由零個或多個字符組成的有限序列&#xff0c;一…

php數組轉為js json,javascript-將數組php轉換為JSON時出錯

我在將多維PHP數組轉換為JSON時遇到了一些麻煩.我使用json_encode進行了轉換,但它為null.我正在嘗試開發orgChart,數據是從CSV文件中讀取的,并保存在數組中.布局和JS代碼用于接收JSON文件,因此我需要使用這種格式.這是數組的一部分,其中包含175個數組Array([2] > Array([id]…

UVa 10954 全部相加(Huffman編碼)

https://vjudge.net/problem/UVA-10954 題意&#xff1a;有n個數的集合S&#xff0c;每次可以從S中刪除兩個數&#xff0c;然后把它們的和放回集合&#xff0c;直到剩下一個數。每次操作的開銷等于刪除的兩個數之和&#xff0c;求最小開銷。 思路&#xff1a;Huffman編碼。 1 #…

serialVersionUID的作用以及如何用idea自動生成實體類的serialVersionUID

轉載&#xff1a;http://blog.csdn.net/liuzongl2012/article/details/45168585 serialVersionUID的作用&#xff1a; 通過判斷實體類的serialVersionUID來驗證版本一致性的。在進行反序列化時&#xff0c;JVM會把傳來的字節流中的serialVersionUID與本地相應實體類的serialVer…

js post方式請求另外一個php,利用JS使用POST方式提交請求的方法(結合代碼詳細解答)...

下面是我給大家整理的利用JS使用POST方式提交請求的方法&#xff0c;有興趣的同學可以去看看。一般都是寫上隱藏的form標簽&#xff0c;用來調用js函數然后submit全部用js來寫也行&#xff0c;以下是我在一個問答頻道看見別人寫的例子&#xff0c;放在這里function post(URL, P…

JBoss BRMS最佳實踐– BPM流程初始化層的提示

我過去發布過一些有關遷移策略的文章&#xff0c;仔細研究了流程層&#xff0c;并提供了一些有關jBPM的最佳實踐 &#xff0c;它們都涉及到BPM策略的非常具體的部分。 我想重新討論最佳實踐的主題&#xff0c;然后在智能集成企業級別上&#xff0c;我們討論使用JBoss BRMS對您的…

寒假作業二:匯總隨筆

隨筆一&#xff1a;解題思路隨筆二&#xff1a;自學計劃 轉載于:https://www.cnblogs.com/mercuialC/p/6359997.html

跨站點腳本(XSS)和預防

如OWASP網站&#xff08;https://www.owasp.org/index.php/Cross-site_Scripting_(XSS&#xff09;&#xff09;所述&#xff0c;跨站點腳本&#xff08;XSS&#xff09;攻擊的變種幾乎是無限的。 在這里&#xff0c;我建議使用基于Servlet篩選器的解決方案來清理HTTP請求。 攻…

NoSQL入門第一天——NoSQL入門與基本概述

一、課程大綱 二、入門概述 1.為什么用NoSQL 單機MySQL的年代&#xff1a; 一個網站的訪問量一般都不大&#xff0c;用單個數據庫完全可以輕松應付。      我們來看看數據存儲的瓶頸是什么&#xff1f;        1.數據量的總大小 一個機器放不下時。&#xff08;現…

隨機森林特征個數mtry matlab,基于隨機森林的特征選擇算法

2.1 算法描述本文提出了一種基于隨機森林的Wrapper特征選擇方法RFFS,利用隨機森林算法的變量重要性度量對特征進行排序,然后采用序列后向搜索方法,每次從特征集合中去掉一個最不重要(重要性得分最小)的特征,逐次進行迭代,并計算分類正確率,最終得到變量個數最少、分類正確率最高…

matlab循環讀取變量,Matlab for 多個變量循環能不能這樣啊 ,求教高手!!!!

該樓層疑似違規已被系統折疊 隱藏此樓查看此樓for a0.003:0.0005:1; b0.002:0.0005:0.9; c0.001:0.0005:0.8;d0.0005:0.0005:0.7;E1a* E_Bone;E2b* E_Bone;E3c* E_Bone;E4d* E_Bone;G1a* G_Bone;G2b* G_Bone;G3c* G_Bone;G4d* G_Bone;%% Integration for cortical bone partsIn…

UVA - 10384 The Wall Pusher(推門游戲)(IDA*)

題意&#xff1a;從起點出發&#xff0c;可向東南西北4個方向走&#xff0c;如果前面沒有墻則可走&#xff1b;如果前面只有一堵墻&#xff0c;則可將墻向前推一格&#xff0c;其余情況不可推動&#xff0c;且不能推動游戲區域邊界上的墻。問走出迷宮的最少步數&#xff0c;輸出…

JavaOne 2012:JavaOne技術主題演講

Mark Reinhold從JavaOne 2012技術主題演講開始。 他說&#xff0c;今年的版本將有所不同&#xff0c;因為它將使用大致相同的示例來說明Java的各個方面&#xff0c;而不是對Java的每個組件進行單獨的單獨介紹。 JavaFX團隊的Richard Bair和Jasper Potts &#xff08;并與FXExpe…