Eigen-約簡,訪問和廣播

約簡化,訪客和廣播

  • 一、約簡化
    • 1. 標準計算
    • 2. 布爾約減
  • 二、訪問
  • 三、部分約簡
    • 1. 將部分約減與其他業務相結合
  • 四、廣播
    • 1. 將廣播與其他業務相結合

一、約簡化

在Eigen中,約簡化是一個接受矩陣或數組并返回單個標量值的函數。最常用的約簡方法之一是.sum(),它返回給定矩陣或數組中所有系數的和。

#include <iostream>
#include <Eigen/Dense>using namespace std;
int main()
{Eigen::Matrix2d mat;mat << 1, 2,3, 4;cout << "Here is mat.sum():       " << mat.sum()       << endl;cout << "Here is mat.prod():      " << mat.prod()      << endl;cout << "Here is mat.mean():      " << mat.mean()      << endl;cout << "Here is mat.minCoeff():  " << mat.minCoeff()  << endl;cout << "Here is mat.maxCoeff():  " << mat.maxCoeff()  << endl;cout << "Here is mat.trace():     " << mat.trace()     << endl;
}//輸出
Here is mat.sum():       10
Here is mat.prod():      24
Here is mat.mean():      2.5
Here is mat.minCoeff():  1
Here is mat.maxCoeff():  4
Here is mat.trace():     5

由函數 trace() 返回的矩陣的軌跡是對角線系數的和,可以等效地計算為 a.diagonal().sum()。

1. 標準計算

向量的(歐幾里得也就是 ?2 )平方范數可以得到 squaredNorm()。它等于向量與自身的點積,也等價于它的系數絕對值的平方和。

Eigen還提供了 norm() 方法,該方法返回 squaredNorm() 的平方根。

這些運算也可以作用于矩陣;在這種情況下,n × p 矩陣被視為大小為 (n * p) 的向量,因此例如 norm() 方法返回 “Frobenius” 或“Hilbert-Schmidt” 范數。我們不討論矩陣 ?2 范數因為它有不同的含義。

如果需要其他與系數相關的 ?p 規范,請使用 lpNorm<p>() 方法。模板參數p可以取特殊值無窮大,如果你想要的是 ? 范數,它是系數絕對值的最大值。

下面的示例演示了這些方法。

#include <Eigen/Dense>
#include <iostream>int main()
{Eigen::VectorXf v(2);Eigen::MatrixXf m(2,2), n(2,2);v << -1,2;m << 1,-2,-3,4;std::cout << "v.squaredNorm() = " << v.squaredNorm() << std::endl;std::cout << "v.norm() = " << v.norm() << std::endl;std::cout << "v.lpNorm<1>() = " << v.lpNorm<1>() << std::endl;std::cout << "v.lpNorm<Infinity>() = " << v.lpNorm<Eigen::Infinity>() << std::endl;std::cout << std::endl;std::cout << "m.squaredNorm() = " << m.squaredNorm() << std::endl;std::cout << "m.norm() = " << m.norm() << std::endl;std::cout << "m.lpNorm<1>() = " << m.lpNorm<1>() << std::endl;std::cout << "m.lpNorm<Infinity>() = " << m.lpNorm<Eigen::Infinity>() << std::endl;
}// 輸出
v.squaredNorm() = 5
v.norm() = 2.23607
v.lpNorm<1>() = 3
v.lpNorm<Infinity>() = 2m.squaredNorm() = 30
m.norm() = 5.47723
m.lpNorm<1>() = 10
m.lpNorm<Infinity>() = 4

算子范數:1 范數和 ∞ 范數矩陣算子范數可以很容易地計算如下:

#include <Eigen/Dense>
#include <iostream>int main()
{Eigen::MatrixXf m(2,2);m << 1,-2,-3,4;std::cout << "1-norm(m)     = " << m.cwiseAbs().colwise().sum().maxCoeff()<< " == "             << m.colwise().lpNorm<1>().maxCoeff() << std::endl;std::cout << "infty-norm(m) = " << m.cwiseAbs().rowwise().sum().maxCoeff()<< " == "             << m.rowwise().lpNorm<1>().maxCoeff() << std::endl;
}// 輸出
1-norm(m)     = 6 == 6
infty-norm(m) = 7 == 7

有關這些表達式語法的更多解釋,請參見下文。

2. 布爾約減

下面的約簡操作是對布爾值進行的:

  • 如果給定矩陣或數組中的所有系數都為真,則 all() 返回真。
  • 如果給定矩陣或數組中至少有一個系數為真,則 any() 返回真。
  • count() 返回給定矩陣或數組中求值為true的系數數。

這些操作符通常與 Array 提供的系數比較和相等操作符一起使用。例如,array > 0 是與 array 大小相同的 array,在 array 對應系數為正的位置為 true。因此,(array > 0).all() 測試數組的所有系數是否都為正。這可以從下面的例子中看到:

#include <Eigen/Dense>
#include <iostream>int main()
{Eigen::ArrayXXf a(2,2);a << 1,2,3,4;std::cout << "(a > 0).all()   = " << (a > 0).all() << std::endl;std::cout << "(a > 0).any()   = " << (a > 0).any() << std::endl;std::cout << "(a > 0).count() = " << (a > 0).count() << std::endl;std::cout << std::endl;std::cout << "(a > 2).all()   = " << (a > 2).all() << std::endl;std::cout << "(a > 2).any()   = " << (a > 2).any() << std::endl;std::cout << "(a > 2).count() = " << (a > 2).count() << std::endl;
}//輸出
(a > 0).all()   = 1
(a > 0).any()   = 1
(a > 0).count() = 4(a > 2).all()   = 0
(a > 2).any()   = 1
(a > 2).count() = 2

二、訪問

當想要獲得矩陣或數組中系數的位置時,也就是獲取矩陣中的特殊元素的時候。訪問器很有用。最簡單的例子是 maxCoeff(&x,&y) 和 minCoeff(&x,&y),它們可用于查找矩陣或數組中最大或最小系數的位置。

傳遞給訪問者的參數是指向存儲行和列位置的變量的指針。這些變量的類型應該是Index,如下所示:

#include <iostream>
#include <Eigen/Dense>int main()
{Eigen::MatrixXf m(2,2);m << 1, 2,3, 4;//get location of maximumEigen::Index maxRow, maxCol;float max = m.maxCoeff(&maxRow, &maxCol);//get location of minimumEigen::Index minRow, minCol;float min = m.minCoeff(&minRow, &minCol);std::cout << "Max: " << max <<  ", at: " <<maxRow << "," << maxCol << std::endl;std:: cout << "Min: " << min << ", at: " <<minRow << "," << minCol << std::endl;
}//輸出
Max: 4, at: 1,1
Min: 1, at: 0,0

這兩個函數還返回最小或最大系數的值。

三、部分約簡

部分約簡是可以在矩陣或數組上按列或按行操作的約簡,對每列或每行應用約簡操作,并返回具有相應值的列或行向量。使用 colwise() 或 rowwise() 應用部分縮減。

一個簡單的例子是獲取給定矩陣中每列元素的最大值,并將結果存儲在行向量中:

#include <iostream>
#include <Eigen/Dense>using namespace std;
int main()
{Eigen::MatrixXf mat(2,4);mat << 1, 2, 6, 9,3, 1, 7, 2;std::cout << "Column's maximum: " << std::endl<< mat.colwise().maxCoeff() << std::endl;
}//輸出
Column's maximum: 
3 2 7 9

同樣的操作可以按行執行:

#include <iostream>
#include <Eigen/Dense>using namespace std;
int main()
{Eigen::MatrixXf mat(2,4);mat << 1, 2, 6, 9,3, 1, 7, 2;std::cout << "Row's maximum: " << std::endl<< mat.rowwise().maxCoeff() << std::endl;
}//輸出
Row's maximum: 
9
7

注意,列操作返回一個行向量,而行操作返回一個列向量。

1. 將部分約減與其他業務相結合

也可以使用部分還原的結果進行進一步處理。這里是另一個例子,它找到一個列,其元素的和在一個矩陣中是最大的。使用按列部分約減,可以將其編碼為:

#include <iostream>
#include <Eigen/Dense>int main()
{Eigen::MatrixXf mat(2,4);mat << 1, 2, 6, 9,3, 1, 7, 2;Eigen::Index   maxIndex;float maxNorm = mat.colwise().sum().maxCoeff(&maxIndex);std::cout << "Maximum sum at position " << maxIndex << std::endl;std::cout << "The corresponding vector is: " << std::endl;std::cout << mat.col( maxIndex ) << std::endl;std::cout << "And its sum is is: " << maxNorm << std::endl;
}//輸出
Maximum sum at position 2
The corresponding vector is: 
6
7
And its sum is is: 13

前面的示例通過colwise()訪問器對每個列應用sum()約簡,獲得一個大小為1x4的新矩陣。

因此,如果

m = [13216792]
然后

m.colwise().sum()=[431311]
最后應用maxCoeff()約簡來獲得找到最大和的列索引,在本例中是列索引2(第三列)。

四、廣播

廣播背后的概念類似于部分約簡,不同之處在于廣播構建了一個表達式,其中矢量(列或行)通過在一個方向上復制來解釋為矩陣。

一個簡單的例子是向矩陣中的每一列添加一個特定的列向量。

這可以通過以下方式實現:

#include <iostream>
#include <Eigen/Dense>using namespace std;
int main()
{Eigen::MatrixXf mat(2,4);Eigen::VectorXf v(2);mat << 1, 2, 6, 9,3, 1, 7, 2;v << 0,1;//add v to each column of mmat.colwise() += v;std::cout << "Broadcasting result: " << std::endl;std::cout << mat << std::endl;
}//輸出
Broadcasting result: 
1 2 6 9
4 2 8 3

我們可以用兩種等價的方式來解釋指令mat.colwise() += v。它把向量v加到矩陣的每一列。或者,它可以被解釋為將向量v重復四次以形成一個4乘2的矩陣,然后將其添加到mat中:

[13216792] +[01010101] =[14226893]。

操作符-=、+和-也可以按列和按行使用。在數組上,我們還可以使用操作符*=、/=、*和/來執行按列或按行計算的系數乘法和除法。這些運算符在矩陣上是不可用的,因為不清楚它們會做什么。如果要將矩陣mat的第0列與v(0)相乘,第1列與v(1)相乘,以此類推,則使用mat = mat * v. asdiagonal()。

重要的是要指出,要按列或按行添加的向量必須是vector類型,而不能是Matrix。如果不滿足這個條件,則會得到編譯時錯誤。這也意味著廣播操作只能在使用矩陣操作時應用于Vector類型的對象。這同樣適用于Array類,其中等價于VectorXf的是ArrayXf。與往常一樣,不應該在同一個表達式中混合使用數組和矩陣。

要按行執行相同的操作,我們可以這樣做:

#include <iostream>
#include <Eigen/Dense>using namespace std;
int main()
{Eigen::MatrixXf mat(2,4);Eigen::VectorXf v(4);mat << 1, 2, 6, 9,3, 1, 7, 2;v << 0,1,2,3;//add v to each row of mmat.rowwise() += v.transpose();std::cout << "Broadcasting result: " << std::endl;std::cout << mat << std::endl;
}//輸出
Broadcasting result: 1  3  8 123  2  9  5

1. 將廣播與其他業務相結合

廣播還可以與其他操作相結合,例如矩陣或數組操作、縮減和部分縮減。

現在已經介紹了廣播、約簡和部分約簡,我們可以深入到一個更高級的例子中,在矩陣m的列中找到向量v的最近鄰居。歐幾里德距離將在這個例子中使用,通過名為squaredNorm()的部分約簡計算歐幾里德距離的平方:

#include <iostream>
#include <Eigen/Dense>int main()
{Eigen::MatrixXf m(2,4);Eigen::VectorXf v(2);m << 1, 23, 6, 9,3, 11, 7, 2;v << 2,3;Eigen::Index index;// find nearest neighbour(m.colwise() - v).colwise().squaredNorm().minCoeff(&index);std::cout << "Nearest neighbour is column " << index << ":" << std::endl;std::cout << m.col(index) << std::endl;
}//輸出
Nearest neighbour is column 0:
1
3

完成這項工作的線是

(m.colwise() - v).colwise().squaredNorm().minCoeff(&index);

具體解析如下:

  • m.colwise() - v是一個廣播操作,從m的每一列中減去v。這個操作的結果是一個新的矩陣,其大小與矩陣m相同:

M.colwise () - v=[?10218447?1]

  • (m.colwise() - v).colwise(). squarednorm()是一個部分約簡,按列計算平方范數。這個操作的結果是一個行向量,其中每個系數是m和v中每列之間的歐幾里德距離的平方:
    在這里插入圖片描述

  • 最后,使用minCoeff(&index)來獲得m中最接近v的歐氏距離列的索引。

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

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

相關文章

心法利器[108] | 微調與RAG的優缺點分析

心法利器 本欄目主要和大家一起討論近期自己學習的心得和體會。具體介紹&#xff1a;倉頡專項&#xff1a;飛機大炮我都會&#xff0c;利器心法我還有。 2023年新的文章合集已經發布&#xff0c;獲取方式看這里&#xff1a;又添十萬字-CS的陋室2023年文章合集來襲&#xff0c;更…

修復通達OA 百度ueditor 文件上傳漏動

前些日子&#xff0c;服務器阿里云監控報警&#xff0c;有文件木馬文件&#xff0c;因為非常忙&#xff0c;就沒及時處理&#xff0c;直接刪除了木馬文件了事。 誰知&#xff0c;這幾天對方又上傳了木馬文件。好家伙&#xff0c;今天不花點時間修復下&#xff0c;你都傳上癮了…

PHP【swoole】

前言 Swoole官方文檔&#xff1a;Swoole 文檔 Swoole 使 PHP 開發人員可以編寫高性能高并發的 TCP、UDP、Unix Socket、HTTP、 WebSocket 等服務&#xff0c;讓 PHP 不再局限于 Web 領域。Swoole4 協程的成熟將 PHP 帶入了前所未有的時期&#xff0c; 為性能的提升提供了獨一無…

Dynamo初學嘗試梳理

學習Dynamo有一段時間了&#xff0c;最近整理了下自己的筆記&#xff0c;分享一些給初學者&#xff0c;做個備忘吧&#xff01;&#xff08;PS&#xff1a;很多資料網上都能搜到&#xff0c;我僅僅是收集整理下筆記&#xff0c;分享給大家&#xff09; 今天先簡單介紹下Dynamo…

展廳設計中多媒體的常用技術

1、互動投影 可以大大提高展廳和觀眾之間的互動體驗&#xff0c;使觀眾不僅可以享受觀看&#xff0c;還可以在輕松娛樂的氛圍中娛樂的氛圍中享受每個展覽的背景故事和內涵&#xff0c;使整個參觀過程非常輕松愉快。 2、幻影成像 可以全面展示企業產品的生產過程&#xff0c;讓觀…

STM32 (4) GPIO(1)

1.芯片的引腳分布 2.普通IO引腳的命名規則 3.IO復用 IO引腳身兼數職的現象叫做IO復用&#xff0c;可以使芯片擁有更多的功能&#xff0c;例如&#xff1a; PA9和PA10既可以用于GPIO的引腳&#xff0c;也可以用于串口或定時器的引腳 通用&#xff1a;CPU直接控制IO引腳的輸入輸…

Linux:用戶格式顯示進程

簡介 在Linux系統中&#xff0c;ps 命令用于查看當前系統中的進程。ps -aux 是該命令的一個常用選項組合&#xff0c;用于以用戶格式顯示所有進程。 ps -aux 輸出的信息內容及含義&#xff1a; USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND r…

【OpenGL編程手冊-04】詳細解釋著色器

著色器 目錄 一、說明二、著色器語言GLSL2.1 典型的著色器代碼2.2 數據類型2.2.1 向量 2.3 輸入與輸出2.3.1 頂點著色器2.3.2 片段著色器 2.4 Uniform2.5 函數后綴含義2 .6 更多屬性&#xff01; 三、我們自己的著色器類四、從文件讀取五、 編譯著色器練習 一、說明 在Hello T…

shopee、美客多、敦煌、國際站賣家如何掌握測評補單的核心要素

對于賣家而言&#xff0c;測評補單是一種經濟高效的推廣策略&#xff0c;它對于提升商品流量、優化轉化率、增強關鍵詞質量分以及加強鏈接權重都起到了積極的推動作用。然而&#xff0c;要實現自養號測評&#xff0c;需滿足以下條件&#xff1a; 首要之務&#xff0c;建立一個穩…

jenkins插件下載失敗bug

如果遇到安裝jenkins插件經常失敗并報以下類似錯誤&#xff0c;很可能是因為jenkins國外官方插件地址下載速度非常慢&#xff0c;我們可以修改為國內插件地址。 java.io.IOException: Failed to load: SCM API Plugin (scm-api 676.v886669a_199a_a_) - Jenkins (2.361.4) or h…

詳細分析Java類調用Service接口失效的注意事項(附Demo)

目錄 前言1. 問題所示2. 原理分析3. 解決方法 前言 試錯了一小時&#xff0c;發現接口返回null&#xff01;&#xff01; 最后梳理其知識點并總結其原理 1. 問題所示 接口類如下&#xff1a; public interface IInfoService extends BaseService<Info> {錯誤方式一&a…

【Zookeeper】ZooKeeper的一些重要功能和作用

&#x1f34e;個人博客&#xff1a;個人主頁 &#x1f3c6;個人專欄&#xff1a;日常聊聊 ?? 功不唐捐&#xff0c;玉汝于成 目錄 前言 正文 結語 我的其他博客 前言 隨著分布式系統的普及和應用場景的不斷增加&#xff0c;構建可靠、高效的分布式系統變得愈發重要。然…

Vue 3 中如何遷移從 Vue 2 的項目?

引言 Vue.js 是一個流行的前端框架&#xff0c;它以其響應式數據綁定和組件化系統而聞名。隨著時間的推移&#xff0c;Vue.js 也在不斷發展和改進。Vue 3 是 Vue.js 的一個重大更新&#xff0c;它帶來了許多新特性和改進&#xff0c;包括更好的性能、更小的體積、更強大的組合…

C 嵌入式系統設計模式 19:保護調用模式

本書的原著為&#xff1a;《Design Patterns for Embedded Systems in C ——An Embedded Software Engineering Toolkit 》&#xff0c;講解的是嵌入式系統設計模式&#xff0c;是一本不可多得的好書。 本系列描述我對書中內容的理解。本文章描述嵌入式并發和資源管理模式之五…

Cesium 3D Tiles 簡介

3D Tiles 是大規模異構 3D 地理空間數據集&#xff08;例如點云、建筑物和攝影測量&#xff09;的開放標準。3D Tiles 基于 glTF 和其他 3D 數據類型構建&#xff0c;是一種可類似二維瓦片模式的流式傳輸的優化格式&#xff0c;旨在適應當今不斷增長的 3D 地理空間數據集的渲染…

編碼規范(前端)

文章目錄 1. 文檔說明1.1 編制說明1.2 名詞解釋 2.前端研發規范2.1 HTML編碼規范2.1.1 文檔類型2.1.2 語言2.1.3 元數據2.1.4 資源加載2.1.5 頁面標題2.1.6 編碼風格2.1.7 標簽2.1.8 屬性2.1.9 語義化 2.2 CSS編碼規范2.2.1 文件引用2.2.2 命名-組成元素 知識點 1. 文檔說明 1…

【數據分享】1979~2020年MSWEP降水數據集

各位同學們好&#xff0c;今天和大伙兒分享的是1979~2020年MSWEP降水數據集。如果大家有下載處理數據等方面的問題&#xff0c;您可以私信或者評論。 Beck, H. E., E. F. Wood, M. Pan, C. K. Fisher, D. G. Miralles, A. I. J. M. van Dijk, T. R. McVicar, and R. F. Adler, …

【軟件設計師】通俗易懂的去了解算法的特性和要求

&#x1f413; 算法 算法是對特定問題求解步驟的一種描述&#xff0c;算法是指令的有限序列。其中每一條指令表示一個或者多個操作。 &#x1f413; 算法的5種屬性 有窮性 一個算法必須總是在執行有窮的步驟后&#xff0c;且在每個步驟執行的過程中時間是有限的 1.有窮性意味…

深度學習 精選筆記(7)前向傳播、反向傳播和計算圖

學習參考&#xff1a; 動手學深度學習2.0Deep-Learning-with-TensorFlow-bookpytorchlightning ①如有冒犯、請聯系侵刪。 ②已寫完的筆記文章會不定時一直修訂修改(刪、改、增)&#xff0c;以達到集多方教程的精華于一文的目的。 ③非常推薦上面&#xff08;學習參考&#x…

藍橋杯:單詞分析

題目 題目描述 小藍給學生們組織了一場考試&#xff0c;卷面總分為 100 分&#xff0c;每個學生的得分都是一個 0 到 100 的整數。 如果得分至少是 60 分&#xff0c;則稱為及格。如果得分至少為 85 分&#xff0c;則稱為優秀。 請計算及格率和優秀率&#xff0c;用百分數表…