Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
有人能解释Revol R中LU分解的异常行为吗?_R_Matrix_Decomposition - Fatal编程技术网

有人能解释Revol R中LU分解的异常行为吗?

有人能解释Revol R中LU分解的异常行为吗?,r,matrix,decomposition,R,Matrix,Decomposition,一个简单的矩阵基准测试表明,Revolution AnalyticsR2.13.2 LU分解比矩阵乘法慢近5倍。 理论和多年的实践表明,对于A*A,LU应该是时间的1/3到2/3 Revo R和Matlab使用Intel的数学内核进行此测试。 R2.14.1未使用内核。所有内容都是64位的 异常情况见下表2。这是关于A*A的表1。还有其他(明显的)异常,但LU是最明显的异常 Table 1 (secs) A

一个简单的矩阵基准测试表明,Revolution Analytics
R2.13.2
LU分解比矩阵乘法慢近5倍。 理论和多年的实践表明,对于
A*A
,LU应该是时间的1/3到2/3

Revo R和Matlab使用Intel的数学内核进行此测试。
R2.14.1
未使用内核。所有内容都是64位的

异常情况见下表2。这是关于
A*A
的表1。还有其他(明显的)异常,但LU是最明显的异常

                        Table 1 (secs)

                    A*A     LU     A\b    Det   Inv
----------------------------------------------------
R 2.14.1           0.757   0.43   0.45   0.20  1.11
Revo R 2.13.2      0.063   0.35   0.11   0.03  0.14
Matlab 2011b       0.062   0.08   0.10   0.07  0.16
----------------------------------------------------
Averaged over 20 runs on a 1000x1000 random matrix


                       Table 2 (normalized)

                    A*A     LU     A\b    Det   Inv
----------------------------------------------------
R 2.14.1             1     0.57   0.19   0.26  1.47
Revol R 2.13.2       1     4.67*  1.58   1.33  2.17
Matlab 2011b         1     0.67   1.72   0.61  1.68
----------------------------------------------------
Note: x = A\b in Matlab is x <- solve(A,b) in R.

以秒为单位的时间

Dell Precision 690, 2 x Intel®  Xeon® E53405 CPU @ 2.33GHz,
16GB ram, 2 Processors, 8 Cores and 8 Threads, 
Windows 7 Prof., 64-bit
包含表格和所用代码的正在进行的工作报告


更新2

我修改了矩阵基准测试,只测试矩阵分解。这些是所有其他矩阵算法的基础,如果这些算法不稳定,那么所有其他算法也将不稳定

我换了一个全新的

Lenovo ThinkPad X220, Intel Core i7-2640M CPU @ 2.80GHz, 
8GB ram, 1 Processor, 2 Cores and 4 Threads
Windows 7 Professional, 64-bit.
注意
Core i7
处理器采用Intel的Turbo Boost,如果感觉到高需求,可将时钟频率提高至3.5GHz。据我所知,三个系统中的任何一个都不受涡轮增压程序(mer)控制

我希望这些变化将使结果更加有用

                          Table 3. Times(secs)

                  A*A    chol(A)   lu(A)    qr(A)    svd(A)   eig(A)   Total
-----------------------------------------------------------------------------
R 2.14.1         0.904    0.157    0.260    0.568    4.260    6.967    13.11
Revol R 2.13.2   0.121    0.029    0.062    0.411    1.623    3.265     5.51   
Matlab 2011b     0.061    0.014    0.033    0.056    0.342    0.963     1.47       
-----------------------------------------------------------------------------
                    Times(secs) averaged over 20  runs



                          Table 4. Times(normalized)

                  A*A    chol(A)   lu(A)    qr(A)    svd(A)  eig(A)   Total
----------------------------------------------------------------------------
R 2.14.1         1.000    0.174    0.288    0.628    4.714    7.711   14.52
Revol R 2.13.2   1.000    0.237    0.515    3.411   13.469   27.095   45.73
Matlab 2011b     1.000    0.260    0.610    0.967    5.768   16.774   25.38
----------------------------------------------------------------------------
                     Times(secs) averaged over 20  runs  
我们可以从表4中看到,虚假异常已经消失,所有系统都按照理论预测的那样运行

                          Table 5. Times/Matlab Times

                  A*A    chol(A)   lu(A)    qr(A)    svd(A)  eig(A)   Total
----------------------------------------------------------------------------
R 2.14.1          15      11         8       10       12       7        9
Revol R 2.13.2     2       2         2        7        5       3        4
----------------------------------------------------------------------------
                         Rounded to the nearest integer


FWIW您不是在测量分解的时间,而是通过始终转换矩阵而产生的开销。在常规R中:

# actual lu call
> system.time(lu(A))
   user  system elapsed 
  0.136   0.000   0.139 
# your code
> system.time(expand(lu(Matrix(A))))
   user  system elapsed 
  0.536   0.000   0.537 
因此,很可能是您自己造成了开销。当分解很快时,这一点尤其重要。还请注意,考虑“R”的性能是不明确的,因为R本身的性能因您使用的BLAS而异


(作为旁注-您可能希望在基准测试中使用
system.time
,您也可能对
microbenchmark
R软件包感兴趣)

!扩展(…)正在增加开销。我将更新上面的表。另外,感谢您的“微基准”提示。FWIW主要的开销在
矩阵中
,开销在
扩展中
小得多
# actual lu call
> system.time(lu(A))
   user  system elapsed 
  0.136   0.000   0.139 
# your code
> system.time(expand(lu(Matrix(A))))
   user  system elapsed 
  0.536   0.000   0.537