Sau một thời gian chờ đợi khá lâu từ phiên bản 6.1, ngày 6-1-2013 vừa qua CVMLIB 7.0, một thư viện rất mạnh hỗ trợ các thao tác trên ma trận được viết bởi tác giả Sergei Nikolaev, đã được tung ra. Phiên bản mới này hỗ trợ thư viện Intel MKL Intel 11.0 Update 1 cũng như các thư viện khác như ACML và lapack (bản 3.4.2). Người sử dụng có thể tự build từ source code trên máy của mình hoặc download bản precompiled về sử dụng. So với Armadillo và Eigen, CVMLIB nhanh hơn (với đa số các thao tác trên ma trận). Sau đây là một ví dụ rất đơn giản cho các thao tác là nhân hai ma trận, SVD và EIG trên ma trận sử dụng CVMLIB:
// A simple example using CVM library
#include <cvm.h>
#include <ctime>
#include <iostream>
using namespace cvm;
using namespace std;
int main(int argc, char * argv[])
{
int n, m;
float *a, *b;
int i;
clock_t st, et;
if(argc==3)
{
n = atoi(argv[1]);
m = atoi(argv[2]);
}else
{
n = m = 1000;
}
a = new float[n*m];
b = new float[n*m];
srand(time(NULL));
for(i=0;i<n*m;i++)
{
a[i] = (float)rand()/INT_MAX;
b[i] = (float)rand()/INT_MAX;
}
basic_rmatrix ma(a, n, m);
basic_rmatrix mb(b, n, m);
basic_rmatrix mc(n, m);
basic_rmatrix asvd(a,n,m);
basic_srmatrix u(n);
basic_srsmatrix ms(n);
basic_srmatrix em(n);
basic_rvector ev(n);
st = clock();
mc = ma*mb;
et = clock();
cout << “Time for matrix multiplication is:” << (float)(et-st)/CLK_TCK;
st = clock();
ev = asvd.svd(u,em);
et = clock();
cout << “Time for SVD is:” << (float)(et-st)/CLK_TCK;
st = clock();
ev.eig(ms, em);
et = clock();
cout << “Time for EIG is:” << (float)(et-st)/CLK_TCK;
delete [] a;
delete [] b;
system(“pause”);
return 0;
}