Eigen-矩陣切片和索引

矩陣切片和索引

  • 一、概述
  • 二、基本的切片
  • 三、編譯時間大小和增量
  • 四、相反的順序
  • 五、索引數組
  • 六、自定義索引列表

一、概述

本頁介紹了操作符 () 為索引子集行和列提供的多種可能性。這個API已經在特性3.4中引入。它支持塊API提出的所有特性,以及更多。特別是,它支持切片,包括在矩陣中均勻間隔的一組行、列或元素,或者從索引數組中索引。

上述所有操作都通過通用的下面的API方法處理。

DenseBase::operator()(const RowIndices&const ColIndices&)

每個參數可以是:

  • 索引單行或列的整數,包括符號索引。
  • 符號 Eigen::all 表示按遞增順序排列的全部行或列。
  • 一個由 Eigen::seq、Eigen::seqN或Eigen::placeholders::lastN 函數構造的算術序列。
  • 任何一維矢量/整數數組,包括Eigen的矢量/數組、表達式、std::vector、std::array以及普通C數組:int[N]。

更一般地說,它可以接受暴露以下兩個成員函數的任何對象:

<integral type> operator[](<integral type>) const;
<integral type> size() const;

其中<integral type>表示與Eigen::Index(即std::ptrdiff_t)兼容的任何整數類型。

二、基本的切片

通過 Eigen::seq 或 Eigen::seqN 函數(其中“seq”表示等差數列),可以在矩陣或向量中獲得一組均勻間隔的行、列或元素。他們的簽名摘要如下:

功能描述示例
seq (firstIdx, lastIdx)表示從firstdx到lastdx的整數序列seq (2,5) <=> {2,3,4,5}
seq (firstIdx, lastIdx, incr)相同的,但使用增量incr從一個索引推進到下一個索引Seq (2,8,2) <=> {2,4,6,8}
seqN (firstIdx, size)表示從firstIdx開始的大小整數序列seqN(2,5) <=> {2,3,4,5,6}
seqN (firstIdx, size, incr)相同的,但使用增量incr從一個索引推進到下一個索引seqN(2,3,3) <=> {2,5,8}

還可以在 Eigen::last 符號的幫助下定義 firstdx 和 lastdx 參數,該符號表示通過 operator() 將等差數列傳遞給底層矩陣/向量后的最后一行、最后一列或最后一個元素的索引。下面是二維數組/矩陣 A 和一維數組/向量 v 的一些示例。

意圖代碼塊Block- api等價
左下角從第i行開始,有n列A(seq(i, last), seqN (0, n))A.bottomLeftCorner (A.rows () - i, n)
塊從i開始,j有m行n列A(seqN(i, m), seqN(i, n))A.block (i, j, m, n)
塊從i0,j0開始,到i1,j1結束A(seq(i0,i1), seq(j0,j1)A.block(i0,j0,i1-i0+1,j1-j0+1)
A的偶列A(all, seq(0,last,2))
前n行奇數AA(seqN(1, n, 2), all)
最后一列A(all, last-1)A.col(A.cols() - 2)
中間一排A(last / 2, all)A.row((A.rows() - 1)/2)
v的最后一個元素從i開始v(seq(i, last))v.tail(v.size() - i)
v的最后n個元素v(seq(last + 1 - n, last))v.tail (n)

正如在最后一個示例中所看到的,引用最后n個元素(或行/列)編寫起來有點麻煩。對于非默認的增量,這變得更加棘手和容易出錯。下面是 Eigen::placeholders::lastN(size) 和 Eigen::placeholders::lastN(size,incr):

意圖代碼塊Block - api等價
v的最后n個元素v(lastN(n))v.tail (n)
大小為m乘以n的A的右下角v(lastN(m), lastN(n))A.bottomRightCorner(m,n)
大小為m乘以n的A的右下角v(lastN(m), lastN(n))A.bottomRightCorner(m,n)
最后n列取1列除以3A(all, lastN(n,3))

三、編譯時間大小和增量

在性能方面,Eigen和編譯器可以利用編譯時大小和增量。為此,可以使用 Eigen::fix<val> 強制執行編譯時參數。這樣的編譯時值可以與 Eigen::last 符號組合使用:

v(seq(last - fix<7>, last - fix<2>))

在這個例子中,Eigen在編譯時知道返回的表達式有6個元素。它相當于:

v(seqN(last-7, fix<6>))

我們可以重新審視A的偶數列,如下所示:

A(all, seq(0,last,fix<2>))

四、相反的順序

還可以使用負增量按降序枚舉行/列索引。例如,從第 20 列到第 10 列A的1 / 2

A(all, seq(20, 10, fix<-2>))

從最后一行開始的最后n行:

A(seqN(last, n, fix<-1>), all)

您還可以使用 ArithmeticSequence::reverse() 方法來反轉其順序。因此,前面的例子也可以寫成:

A(lastN(n).reverse(), all)

五、索引數組

泛型操作符()也可以接受任意的行或列索引列表作為輸入,存儲形式可以是 ArrayXi、std::vector、std::array<int,N> 等。

下面的例子就是用用 ind 里的數作為索引,去取A中的指定列構成的新矩陣。

std::vector<int> ind{4,2,5,5,3};
MatrixXi A = MatrixXi::Random(4,6);
cout << "Initial matrix A:\n" << A << "\n\n";
cout << "A(all,ind):\n" << A(Eigen::placeholders::all,ind) << "\n\n";// 輸出
Initial matrix A:7   9  -5  -3   3 -10-2  -6   1   0   5  -56  -3   0   9  -8  -86   6   3   9   2   6A(all,ind):3  -5 -10 -10  -35   1  -5  -5   0-8   0  -8  -8   92   3   6   6   9

你也可以直接傳遞一個靜態數組:

MatrixXi A = MatrixXi::Random(4,6);
cout << "Initial matrix A:\n" << A << "\n\n";
cout << "A(all,{4,2,5,5,3}):\n" << A(Eigen::placeholders::all,{4,2,5,5,3}) << "\n\n";//輸出
Initial matrix A:7   9  -5  -3   3 -10-2  -6   1   0   5  -56  -3   0   9  -8  -86   6   3   9   2   6A(all,{4,2,5,5,3}):3  -5 -10 -10  -35   1  -5  -5   0-8   0  -8  -8   92   3   6   6   9

或表達式:

ArrayXi ind(5); ind<<4,2,5,5,3;
MatrixXi A = MatrixXi::Random(4,6);
cout << "Initial matrix A:\n" << A << "\n\n";
cout << "A(all,ind-1):\n" << A(Eigen::placeholders::all,ind-1) << "\n\n";//輸出
Initial matrix A:7   9  -5  -3   3 -10-2  -6   1   0   5  -56  -3   0   9  -8  -86   6   3   9   2   6A(all,ind-1):
-3  9  3  3 -50 -6  5  5  19 -3 -8 -8  09  6  2  2  3

當傳遞具有編譯時大小的對象(如Array4i、std::array<int,N>或靜態數組)時,返回的表達式也顯示編譯時尺寸。

六、自定義索引列表

更一般地說,operator()可以接受任何類型為T的對象ind作為輸入,并且兼容:

Index s = ind.size(); or Index s = size(ind);
Index i;
i = ind[i];

這意味著您可以輕松地構建自己的序列生成器并將其傳遞給operator()。下面是一個例子,擴大一個給定的矩陣,同時填充額外的第一行和列通過重復:

struct pad {Index size() const { return out_size; }Index operator[] (Index i) const { return std::max<Index>(0,i-(out_size-in_size)); }Index in_size, out_size;
};Matrix3i A;
A.reshaped() = VectorXi::LinSpaced(9,1,9);
cout << "Initial matrix A:\n" << A << "\n\n";
MatrixXi B(5,5);
B = A(pad{3,5}, pad{3,5});
cout << "A(pad{3,N}, pad{3,N}):\n" << B << "\n\n";//輸出
Initial matrix A:
1 4 7
2 5 8
3 6 9A(pad{3,N}, pad{3,N}):
1 1 1 4 7
1 1 1 4 7
1 1 1 4 7
2 2 2 5 8
3 3 3 6 9

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

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

相關文章

Java面試錯誤或者難點記錄

數據庫方向 1. mysql數據庫中的DATE_FORMAT函數作用是什么&#xff1f;sql server有相同作用的函數嗎&#xff1f; DATE_FORMAT函數是格式化日期或時間類型的數據&#xff0c;有兩個參數&#xff0c;第一個參數是日期或者時間數據&#xff0c;第二個參數是格式化字符串&#…

如何用ChatGPT+GEE+ENVI+Python進行高光譜,多光譜成像遙感數據處理?

原文鏈接&#xff1a;如何用ChatGPTGEEENVIPython進行高光譜&#xff0c;多光譜成像遙感數據處理&#xff1f; 第一&#xff1a;遙感科學 從攝影偵察到衛星圖像 遙感的基本原理 遙感的典型應用 第二&#xff1a;ChatGPT ChatGPT可以做什么&#xff1f; ChatGPT演示使用 …

工廠模式:沒你想像的那么難

工廠模式 工廠模式是一種創建型設計模式&#xff0c;它允許創建對象而無需指定將要創建的對象的具體類。它通過將對象的創建委托給一個單獨的方法或類來完成&#xff0c;從而隱藏了對象的實例化邏輯。這樣可以提高代碼的靈活性&#xff0c;減少了代碼中的重復和耦合。 在工廠…

2021年下半年教師資格證考試《高中信息技術》題

4.使用某轉碼軟件對一段時長為2分鐘的AVI視頻進行轉碼&#xff0c;轉碼后的視頻信息如圖4所示&#xff0c;計算存儲該視頻文件所需的空間大小為&#xff08;C &#xff09;。 A18MB B36MB C60MB D512MB 6.某21位二進制代碼100101011010011110101&#xff0c;已知該代碼由3個…

html基礎操練和進階修煉寶典

文章目錄 1.超鏈接標簽2.跳錨點3.圖片標簽4.表格5.表格的方向屬性6.子窗口7.音視頻標簽8.表單9.文件上傳10.input屬性 html修煉必經之路—各種類型標簽詳解加展示&#xff0c;關注點贊加收藏&#xff0c;防止迷路哦 1.超鏈接標簽 <!DOCTYPE html> <html lang"en…

再議【每天進步一點點】

概述 之前聽姜胡說&#xff0c;講到了他自己日更博客的故事&#xff0c;也就是每天去更新一篇博客文章。 日更&#xff0c;其實是一件很可怕的事情。 先不說文章的深度如何&#xff0c;單單從時間的耗費上&#xff0c;文字的積累上&#xff0c;以及對事物的敏感度上&#xf…

vue實現自定義樹形穿梭框功能

需求&#xff1a; 我們在開發過程中&#xff0c;會遇到需要將一個數據選擇做成穿梭框&#xff0c;但是要求穿梭框左側為樹形結構、右側為無層級結構的數據展示&#xff0c;ElementUI自身無法在穿梭框中添加樹形結構&#xff0c;網上搜到了大佬封裝的插件但是對于右側的無樹形結…

【從Python基礎到深度學習】9.Python 語法基礎

一、常量與變量 常量:程序中使用的具體的數、字符。在運行過程中&#xff0c;值無法更改 變量:表示一一個存儲單元&#xff0c;其中存儲的值可以修改 如&#xff1a;a5,b6 變量命名: 1、只能包含字母、數字、下劃線 2、只能以字母、下劃線開頭 3、不要使用關鍵字作為變量名稱 …

不知道倫敦銀模擬賬戶該如何使用?至少3個用法

由于模擬交易的特別屬性&#xff0c;很多人對模擬交易并不用心&#xff0c;假的資金用心干什么&#xff1f;就算交易得再好&#xff0c;盈利得再多&#xff0c;假的資金會變成真的嗎&#xff1f;因此當然不會這么用心對待倫敦銀模擬賬戶交易賬戶。實際上&#xff0c;這種觀點是…

Python 操作數據結構隊列 queue和 雙端隊列 deque

“”" 隊列&#xff08;Queue&#xff09;和雙端隊列&#xff08;Deque, Double-ended Queue&#xff09;都是線性數據結構&#xff0c;但它們在操作上有所不同&#xff1a; 隊列&#xff08;Queue&#xff09;&#xff1a; 隊列遵循先進先出&#xff08;FIFO, First-In…

List集合的Stream流式操作實現數據類型轉換

目錄 問題現象&#xff1a; 問題分析&#xff1a; 解決方法&#xff1a; 拓展&#xff1a; 1、Collectors.toList() 2、Collectors.toCollection(ArrayList::new) 3、Collectors.toCollection(LinkedList::new) 4、Collectors.toCollection(LinkedHashSet::new) 5、Collector…

MAC M1 安裝mongodb7.0.5 版本

1、進入官網 Download MongoDB Community Server | MongoDBDownload MongoDB Community Server non-relational database to take your next big project to a higher level!https://www.mongodb.com/try/download/community 2、選擇版本 3、下載后解壓 放到 /usr/local 并修改…

Facebook Messenger鏈接分享:如何創建鏈接并設置自動化內容

Facebook Messenger鏈接是指基于Facebook用戶名創建的會話鏈接&#xff0c;用戶可以在其Facebook頁面的設置部分復制此鏈接進行分享。然后將該鏈接直接粘貼到獨立站、電子郵件、名片或社交媒體中&#xff0c;讓目標受眾可以一鍵進入對話。為了滿足某些商家的需求&#xff0c;Fa…

vue3中的ref和reactive的區別

vue3中的ref和reactive的區別 1、響應式數據2、ref3、reactive4、ref VS reactive5、往期回顧總結&#xff1a; 1、響應式數據 處理響應式數據時到底是該用ref還是reactive... 響應式數據是指在 Vue.js 中&#xff0c;當數據發生變化時&#xff0c;相關的視圖會自動更新以反映…

【bash】2、手把手實現一個 bash shell:多個機器批量執行 shell 命令,支持 ip 補全

文章目錄 一、需求&#xff1a;多臺機器批量遠程執行 shell 命令1.1 業務需求拆解為腳本需求1.2 幫助函數&#xff1a;使用說明文檔1.3 main 函數框架 二、功能&#xff1a;單機 sshp 執行2.1 fullip 函數&#xff1a;實現 ip 補全2.1.1 參數說明2.1.2 定義全局變量2.1.3 實現&…

Cu-HCP-H035 Cu-HCP-R250銅合金高精度零部件

Cu-HCP-H035 Cu-HCP-R250銅合金高精度零部件 CDA102-3/4H EN1982-CC333G EN1982-CC492K BS1400-LG4 EN1982-CC491K BS1400-LG2 CuNi18Zn19Pb1/CW408J CuNi12Zn38Mn5Pb2/CW407J CuNi12Zn30Pb1/CW406J CuNi12Zn29/CW405J CuNi12Zn25Pb1/CW404J CuNi10Zn42Pb2/CW402J CuNi10Zn27/C…

Pytorch 復習總結 4

Pytorch 復習總結&#xff0c;僅供筆者使用&#xff0c;參考教材&#xff1a; 《動手學深度學習》Stanford University: Practical Machine Learning 本文主要內容為&#xff1a;Pytorch 深度學習計算。 本文先介紹了深度學習中自定義層和塊的方法&#xff0c;然后介紹了一些…

基于Beego 1.12.3的簡單website實現

參考 用Beego開發web應用 https://www.cnblogs.com/zhangweizhong/p/10919672.htmlBeego官網 Homepage - beego: simple & powerful Go app frameworkbuild-web-application-with-golang https://github.com/astaxie/build-web-application-with-golang/blob/master/zh/pr…

源碼的角度分析Vue2數據雙向綁定原理

什么是雙向綁定 我們先從單向綁定切入&#xff0c;其實單向綁定非常簡單&#xff0c;就是把Model綁定到View&#xff0c;當我們用JavaScript代碼更新Model時&#xff0c;View就會自動更新。那么雙向綁定就可以從此聯想到&#xff0c;即在單向綁定的基礎上&#xff0c;用戶更新…

微信開發者工具-代碼管理和碼云Github遠程倉庫集成

目錄 思考&#xff1a;IDE如何進行代碼管理 代碼管理方式 一、自身提供服務 二、Git 擴展 1、環境準備 2、創建項目代碼 3、進行項目Git初始化 4、在碼云新建遠程倉庫 5、將項目進行遠程倉庫關聯 三、SVN擴展 四、代碼管理 思考&#xff1a;IDE如何進行代碼管理 初識開…