1. 程式人生 > >Armadillo,Eigen,OpenCV 矩陣操作比較(Compare Armadillo, Eigen and OpenCV)

Armadillo,Eigen,OpenCV 矩陣操作比較(Compare Armadillo, Eigen and OpenCV)

有的時候寫出來的程式慢也許並不是演算法有問題,而是用的庫比較慢;也可能並不是庫本身慢,而只是你的寫法不夠高效。在經歷了無數次令人蛋疼的等待後,我決定比較一下這幾個所謂的高效的線性代數庫(OpenCV雖然目標是計算機視覺,但也提供了比較豐富的代數計算能力),看看它們的效能到底怎麼樣。

有人已經做過類似的事情了,比如  OpenCV vs. Armadillo vs. Eigen on Linux revisited,這哥們比較了這幾個庫在各種矩陣運算方面的效率,總結的比較齊全。但是,在計算機視覺領域這些還不夠,比如經常使用的相似性度量(Similarity Measure)的計算。當然後很多種方法,這裡就考慮最基本的SAD(Sum of Absolute Difference)方法吧,簡單來說就是把兩個矩陣(或者向量)相減,求個絕對值,再加起來。這個計算看起來挺簡單的,不過比較的結果令我比較意外。

 先把程式碼貼出來吧。

//	PerformanceTest.h

#pragma warning(disable:4344)
#define DEIGEN_NO_DEBUG
#define DNDEBUG

#include <emmintrin.h>
#include <opencv.hpp>
#include <vector>
#include <iostream>
#include <armadillo>
#include <Eigen/Dense>
#include "Timer.h"

using namespace std;

//	PerformanceTest.cpp

#include "PerformanceTest.h"

int main(void)
{
	Timer timer;		//	timer
	double elapsedTime;	//	time in millisecond
	double res;			//	SAD value
	int i;				//	loop variable
	float bnd = 1e5;	//	loop times

	//	Armadillo
	arma::mat armaA(4, 1);
	arma::mat armaB(4, 1);
	timer.start();
	for (i = 0; i < bnd; ++i)
	{
		res = arma::accu(arma::abs(armaA - armaB));

		//res = 0;
		//for (int idx = 0; idx < 4; ++idx)
		//{
		//	res += abs(armaA(idx, 0) - armaB(idx, 0));
		//}
	}
	elapsedTime = timer.getElapsedTimeInMilliSec();
	cout<<"arma time : "<<elapsedTime<<" ms"<<endl;

	//	Eigen
	Eigen::Vector4d eiA;
	Eigen::Vector4d eiB;
	Eigen::Vector4d eiC;
	timer.start();
	for (i = 0; i < bnd; ++i)
	{
		res = (eiA - eiB).cwiseAbs().sum();
		//res = 0;
		//for (int idx = 0; idx < 4; ++idx)
		//{
		//	res += abs(eiA(idx,0) - eiB(idx, 0));
		//}
	}
	elapsedTime = timer.getElapsedTimeInMilliSec();
	cout<<"eigen time : "<<elapsedTime<<" ms"<<endl;

	//	OpenCV
	cv::Mat ocvA(4, 1, CV_64F);
	cv::Mat ocvB(4, 1, CV_64F);
	timer.start();
	for (i = 0; i < bnd; ++i)
	{
		res = cv::sum(cv::abs(ocvA - ocvB))[0];
		//res = 0;
		//for (int idx = 0; idx < 4; ++idx)
		//{
		//	res += abs(ocvA.at<double>(idx, 0) - ocvB.at<double>(idx, 0));
		//}
	}
	elapsedTime = timer.getElapsedTimeInMilliSec();
	cout<<"opencv time : "<<elapsedTime<<" ms"<<endl;

	//	pointer operation
	double *a = (double*)_mm_malloc(4 * sizeof(double), 16);
	double *b = (double*)_mm_malloc(4 * sizeof(double), 16);
	int len = ocvA.rows;
	timer.start();
	for (i = 0; i < bnd; ++i)
	{
		res = 0;
		for (int idx = 0; idx < len; ++idx)
		{
			res += abs(a[idx] - b[idx]);
		}
		//cout<<"i = "<<i<<endl;
	}
	elapsedTime = timer.getElapsedTimeInMilliSec();
	cout<<"array operation : "<<elapsedTime<<" ms"<<endl;

	//	release resource
	_mm_free(a);
	_mm_free(b);
	return 0;
}



其中的計時函式用到的是 Franz Kafka 提供的跨平臺高精度計時類,可以從以下地址下載 High Resolution Timer

用以上程式碼在 release 下得到的結果如下:

arma time : 0.87827 ms
eigen time : 0.13641 ms
opencv time : 179.599 ms
array operation : 0.135591 ms


可以看出 Eigen 的時間和直接用陣列運算的時間是相當的,Armadillo 的時間慢了 6~7 倍左右,而 OpenCV 已經目不忍視了,不知道 OpenCV 是怎麼想的,差距有點懸殊。

下面又做了另外一組對比,把迴圈中的求 SAD 部分用類似於陣列的方式自己計算,結果如下

arma time : 0.145423 ms
eigen time : 0.134772 ms
opencv time : 0.134362 ms
array operation : 0.139278 ms


這下計算時間基本上是相當的了。

通過這些對比得到兩個結論:

1、雖然這些庫在矩陣相乘等操作上可能比較高效,但是對於某些低階操作可能效率並不高

2、通過模板訪問資料並不比陣列效率低,效能基本相當

實驗環境:

Windows 7 Ultimate SP1

Visual C++ 2008

Armadillo 3.4.4

Eigen 3.1.2

OpenCV 2.3.1

Compiled to 32-bit binary

相關推薦

ArmadilloEigenOpenCV 矩陣操作比較Compare Armadillo, Eigen and OpenCV

有的時候寫出來的程式慢也許並不是演算法有問題,而是用的庫比較慢;也可能並不是庫本身慢,而只是你的寫法不夠高效。在經歷了無數次令人蛋疼的等待後,我決定比較一下這幾個所謂的高效的線性代數庫(OpenCV雖然目標是計算機視覺,但也提供了比較豐富的代數計算能力),看看它們的效能到底

矩陣操作比較ArmadilloEigenOpenCV

// PerformanceTest.h #pragma warning(disable:4344) #define DEIGEN_NO_DEBUG #define DNDEBUG #include <emmintrin.h> #include <opencv.hpp> #incl

C# 操作TreeView 數據庫讀取數據2017-12-12學習筆記

rom 工具 執行 ext des pat view ring () 1.學習知識點: 數據庫操作語法: SqlConnection 數據庫連接對象 SqlConnection con =new SqlConnection(); con.open();//打開數據庫 Sq

Opencv矩陣操作copyTo convertTo clone reshape

<div id="article_content" class="article_content clearfix csdn-tracking-statistics" data-pid="blog" data-mod=popu_307 data-dsm = "post" >

給出n個學生的考試成績表每條記錄由學號、姓名和分數和名次組成設計演算法完成下列操作1設計一個顯示對學生資訊操作的選單函式如下所示: *************************

給出n個學生的考試成績表,每條記錄由學號、姓名和分數和名次組成,設計演算法完成下列操作: (1)設計一個顯示對學生資訊操作的選單函式如下所示: *************************        1、錄

幫助方老師使用固態硬盤安裝win10賺了150軟妹幣但是他賴賬了!

說明 pre 更改 計算 軟件工程 記得 重裝系統 32位 網站   作為一個計算機專業的,具體點是軟件工程,每次別人問自己是幹啥的,總會被帶入到對方的節奏:哦,能裝系統,會修電腦。。。   今天方老師(一起工作了4年多的曾經是個真正的老濕!搞藝術的!已經提了離職報告了,不

關於html的多行匹配正則re.S的使用爬取豆瓣電影短評

htm detail 3.1 port encoding 關於 color tel frame 參考鏈接:http://www.python(tab).com/html/2017/pythonhexinbiancheng_0904/1170.html(去除括號)     

ubuntu 12.04 簡單配置samba服務實現主機與虛擬機互通設置Windows虛擬盤

完成 sam inux ... conf restart bridged 要求 system 環境: virtualbox ubuntu12.04 首先,如果你到這步了,說明你的window與linux的網絡已經配好了,他們之間是可以互相Ping通的,如果沒有,請看我以

sql如何通過當前日期獲取上周上上周上上上周的起始日期周一_周七

pst edi 當前時間 當前日期 獲取 ofo pyw best www 當前時間周的起始日期(以周一為例)select DATEADD(week,DATEDIFF(week,0,getdate()),0)上周起始:select dateadd(week,-1,DATEA

朝夕共處的同事拋棄你時可沒空和你說再見不止適用於程序員

程序人生 IT職場 程序員 原本坐在你身邊和你一個組,每天同樣敲枯燥的業務代碼同事突然薪資翻倍被挖走,或者突然被提拔為你的TL,而你仍默默地拿著不變的薪水敲重復的代碼。你肯定經歷過悄無聲息的小拋棄。1.哪有永遠的“我比你強”,只是你不肯升級記憶同齡的王健被分配帶應屆生陳遠,王健一開始給陳遠定位為“

看完讓你徹底理解 WebSocket 原理附完整的實戰代碼包含前端和後端

tcp 協議 learn php 握手 live 雙向 簡單 再次 註意 1、前言 最近有同學問我有沒有做過在線咨詢功能。同時,公司也剛好讓我接手一個 IM 項目。所以今天抽時間記錄一下最近學習的內容。本文主要剖析了 WebSocket 的原理,以及附上一個完整的聊天室實戰

C++找出一個二維陣列中的鞍點即該位置上的元素在該行上最大在該列上最小也可能沒有鞍點

今日正式用csdn部落格記錄,回顧我所學到的知識,分享一些我的人生感悟和自身經歷。也希望未來通夠過此平臺和更多喜愛程式設計的人交流學習。 道聽途說再加上自己的感悟,認為程式設計最重要的是思想,而不是語言本身,語言只是個工具。所以我們得先學思想。遇到問題,應該先想如果是自己去做會怎麼處理,但我們不

微服務那些你該懂的知識服務的註冊和發現

微服務 微服務按照我個人的理解就是將眾多的功能拆分成一個個子服務,其中以現在很流行的SpringBoot框架進行開發,再以SpringCloud方式進行部署。進而可以在SpringCloud的服務平臺中對SpringBoot的一個個服務進行註冊和監控。 一、服務註冊與發現 關

呼叫函式時到底什麼時候要用指標接收看完就不難理解了Swap交換函式為例

在這裡我通過講解一個交換函式來講解一下什麼時候傳參需要用指標接收。   這裡先看一段程式碼,很多初學者對指標掌握不夠,經常會寫出這樣的程式碼: #define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #include&

求解Ax=0:主變數特解-線性代數課時7MIT Linear Algebra , Gilbert Strang

        這是Strang教授的第七講,這節課是一個轉折,它從定義轉向演算法,這節課主要內容是求解矩陣的零空間,通過一個例子講解了通過消元法求解Ax=0,並在貫通例子的過程中介紹了幾個新的概念:特解、主變數、自由變數、主列、自由列、階梯矩陣U和簡化的

day023正則表示式re模組簡單爬蟲和多頁面爬蟲幹掉數字簽名證書驗證

本節內容: 1、正則表示式 2、re模組的運用 3、簡單的爬蟲練習 一、正則表示式(Regular Expression) 正則表示式是對字串操作的⼀種邏輯公式. 我們⼀般使⽤正則表示式對字串進⾏匹配和過濾. 使⽤正則的優缺點: 優點: 靈活, 功能性強, 邏輯性強. 缺點: 上⼿難. ⼀旦上⼿, 會愛

【小家思想】通俗易懂版講解JWT和OAuth2以及他倆的區別和聯絡Token鑑權解決方案

相關閱讀 【小家java】java5新特性(簡述十大新特性) 重要一躍 【小家java】java6新特性(簡述十大新特性) 雞肋升級 【小家java】java7新特性(簡述八大新特性) 不溫不火 【小家java】java8新特性(簡述十大新特性) 飽受讚譽 【小家java】java9

快速用JavaScript實現劃詞取詞可複製百度文庫文字獲取滑鼠選中區域文字

完整程式碼可在最後程式碼塊檢視呦!!! ※本貼程式碼,可用用於油猴指令碼,支援瀏覽器F12Console控制檯直接執行 有一段時間呢在百度文庫查詢資料時被限制了複製,說什麼複製次數已達上限,那個 難受鴨!!於是我打開了傳說中的F12,意外的發現了一個功能 就是很意外的發現我所選中的文字會在

64位 windows10MYSQL8.0.13重置密碼忘記密碼或者無法登入

原文: 64位 windows10,MYSQL8.0.13重置密碼(忘記密碼或者無法登入) 上一節的MySQL的配置安裝裡,並沒有用到配置檔案my.ini。那在MYSQL8.0.13如何解決密碼重置問題呢。我去網上搜了好多的資料都是改配置檔案my.ini的,後來終於找到了一條命令:操作步驟如下: &nbs

SRPG遊戲開發三十五第八章 遊戲中的資料 - 五 測試匯出匯入與編輯器說明Test, Export, Import and Description

返回總目錄 第八章 遊戲中的資料(Data in Game) 在之前的章節中,我們進行地圖物件的生成,移動等操作。 這一章本來可以進行戰鬥的編寫,不過資料缺失是一個問題。 所以這一章我們先來建立一些資料,以及如何編輯它們,是否需要生成配置檔案等。 文章