【发布时间】:2017-08-02 19:19:39
【问题描述】:
我正在尝试在 Armadillo 中使用稀疏矩阵,并注意到与使用 Mat<int> 的等效代码相比,使用 SpMat<int> 的访问时间存在显着差异。
说明:
以下是两种方法,除了Method_One 使用正则矩阵和Method_Two 使用稀疏矩阵之外,它们在各方面都是相同的。
这两种方法都采用以下参数:
-
WS, DS:指向NN维数组的指针 -
WW: 13 K [max(WS)] -
DD: 1.7 K [max(DS)] -
NN:230 万 -
TT: 50
我正在使用 Visual Studio 2017 将代码编译成一个可以从 Matlab 调用的 .mexw64 可执行文件。
代码:
void Method_One(int WW, int DD, int TT, int NN, double* WS, double* DS)
{
Mat<int> WP(WW, TT, fill::zeros); // (13000 x 50) matrix
Mat<int> DP(DD, TT, fill::zeros); // (1700 x 50) matrix
Col<int> ZZ(NN, fill::zeros); // 2,300,000 column vector
for (int n = 0; n < NN; n++)
{
int w_n = (int) WS[n] - 1;
int d_n = (int) DS[n] - 1;
int t_n = rand() % TT;
WP(w_n, t_n)++;
DP(d_n, t_n)++;
ZZ(n) = t_n + 1;
}
return;
}
void Method_Two(int WW, int DD, int TT, int NN, double* WS, double* DS)
{
SpMat<int> WP(WW, TT); // (13000 x 50) matrix
SpMat<int> DP(DD, TT); // (1700 x 50) matrix
Col<int> ZZ(NN, fill::zeros); // 2,300,000 column vector
for (int n = 0; n < NN; n++)
{
int w_n = (int) WS[n] - 1;
int d_n = (int) DS[n] - 1;
int t_n = rand() % TT;
WP(w_n, t_n)++;
DP(d_n, t_n)++;
ZZ(n) = t_n + 1;
}
return;
}
时间:
我在犰狳中使用wall_clock 计时器对象对这两种方法进行计时。例如,
wall_clock timer;
timer.tic();
Method_One(WW, DD, TT, NN, WS, DS);
double t = timer.toc();
结果:
-
Method_One使用Mat<int>的时间已过:0.091 sec -
Method_Two使用SpMat<int>:30.227 sec的时间已过(慢了将近 300 倍)
高度赞赏对此的任何见解!
更新:
这个问题已经用较新的犰狳version (8.100.1) 解决了。
以下是新结果:
-
Method_One使用Mat<int>的时间已过:0.141 sec -
Method_Two使用SpMat<int>的时间已过:2.127 sec(慢 15 倍,这是可以接受的!)
感谢康拉德和瑞恩。
【问题讨论】:
标签: c++ sparse-matrix mex armadillo