我开始测试Haskell的线性代数.有没有人为此目的提供最佳套餐的建议?使用Haskell进行基本矩阵操作的任何其他好资源?
haskell wiki 为此列出了几个资源.我目前专注于hmatrix和bindings-gsl,两者看起来都很有希望.
我可以在我的主目录中成功安装gsl库,但是当我尝试安装gsl gem时,我得到了一个我不理解的大错误列表.我想知道是否有人可以告诉我为什么我会得到这些错误.我可以说我有:
成功安装gsl; 至少那是它的样子.我指出了gsl-config的路径
这是错误日志的样子:
Building native extensions. This could take a while...
ERROR: Error installing gsl:
ERROR: Failed to build gem native extension.
/home/ted/ruby-1.9.1/bin/ruby extconf.rb install gsl
checking gsl version... 1.15
checking gsl cflags... -I/home/ted/gsl-1.15/include
checking for main() in -lcblas... no
checking gsl libs... -L/home/ted/gsl-1.15/lib -lgsl -lgslcblas -lm
checking for round()... no
checking for rngextra/rngextra.h... no
checking for qrngextra/qrngextra.h... no
checking for ool/ool_version.h... no
checking for tensor/tensor.h... no
checking for jacobi.h... no
checking for gsl/gsl_cqp.h... no
checking for gsl/gsl_multimin_fsdf.h... …Run Code Online (Sandbox Code Playgroud) 我希望标题中的问题的答案是我做了一些愚蠢的事情!
这是问题所在.我想计算一个真实对称矩阵的所有特征值和特征向量.我已经使用GNU Scientific Library在MATLAB中实现了代码(实际上,我使用Octave运行它)和C++ .我在下面提供了完整的代码用于两种实现.
据我所知,GSL带有自己的BLAS API实现,(以下我将其称为GSLCBLAS)并使用我使用以下编译的库:
g++ -O3 -lgsl -lgslcblas
Run Code Online (Sandbox Code Playgroud)
GSL表明这里使用替代BLAS库,如自我优化ATLAS库,以提高性能.我正在运行Ubuntu 12.04,并已从Ubuntu存储库安装了ATLAS软件包.在这种情况下,我编译使用:
g++ -O3 -lgsl -lcblas -latlas -lm
Run Code Online (Sandbox Code Playgroud)
对于所有三种情况,我已经使用随机生成的大小为100到1000的矩阵进行了实验,步长为100.对于每个大小,我执行10个具有不同矩阵的特征分解,并平均所花费的时间.结果如下:

性能上的差异是荒谬的.对于大小为1000的矩阵,Octave在一秒钟内执行分解; GSLCBLAS和ATLAS大约需要25秒.
我怀疑我可能错误地使用了ATLAS库.欢迎任何解释; 提前致谢.
关于代码的一些注意事项:
在C++实现中,不需要使矩阵对称,因为该函数仅使用它的下三角部分.
在Octave中,该行triu(A) + triu(A, 1)'强制矩阵是对称的.
如果您希望将C++代码编译为您自己的Linux机器,则还需要添加该标志-lrt,因为该clock_gettime功能.
不幸的是我不认为clock_gettime退出其他平台.考虑将其更改为gettimeofday.
八度代码
K = 10;
fileID = fopen('octave_out.txt','w');
for N = 100:100:1000
AverageTime = 0.0;
for k = 1:K
A = randn(N, N);
A = triu(A) + triu(A, 1)'; …Run Code Online (Sandbox Code Playgroud) 为什么用 Numpy 的矩阵乘法比用gsl_blas_sgemmGSL快得多,例如:
import numpy as np
import time
N = 1000
M = np.zeros(shape=(N, N), dtype=np.float)
for i in range(N):
for j in range(N):
M[i, j] = 0.23 + 100*i + j
tic = time.time()
np.matmul(M, M)
toc = time.time()
print(toc - tic)
Run Code Online (Sandbox Code Playgroud)
给出 0.017 - 0.019 秒之间的值,而在 C++ 中:
#include <chrono>
#include <iostream>
#include <gsl/gsl_matrix.h>
#include <gsl/gsl_blas.h>
using namespace std::chrono;
int main(void) {
int N = 1000;
gsl_matrix_float* M = gsl_matrix_float_alloc(N, N);
for (int i = …Run Code Online (Sandbox Code Playgroud) 我想用GSL(Gnu Scientific Lib)来计算数组的标准偏差. http://www.gnu.org/software/gsl/manual/html_node/Mean-and-standard-deviation-and-variance.html
在手册中,函数原型是gsl_stats_sd(const double data [],size_t stride,size_t n)
但是,我不太明白这里的"跨越"是什么.有人会知道它是什么吗?
非常感谢您的任何建议!
-阿尔弗雷德
我用gsl.编译完.cpp文件并运行后,我面临以下错误:
加载共享库时出错:libgsl.so.0:无法打开共享对象文件:没有这样的文件或目录
我在以下问题中发现了同样的问题:https://groups.google.com/forum/#!topic / cortex_var / 6vluX7pP0Sk& Linux加载共享库时出错:无法打开共享对象文件:没有这样的文件或目录 & http:/ /www.gnu.org/software/gsl/manual/html_node/Shared-Libraries.html
我已经按照上面的链接写了但是错误仍然存在.谁能帮我?
尝试进行线性回归的系统有多大是合理的?
具体来说:我有一个约300K采样点和~1200个线性项的系统.这在计算上是否可行?
我正在使用Qt 4.8.3和QtCreator,我根据这里的说明使用msvc2010编译.然而,现在我需要链接到GSL(Gnu科学图书馆),但是目前我只知道如何使用g ++构建它,正如此处所描述的那样产生链接器错误,这无疑是出于@EvanTeran答案中给出的原因.然而,在我的情况下,通过Cygwin构建Qt使用g ++可能不是一种选择-从来就刚刚结束了在此期间,我试着做只是这多天的噩梦,但不能作为记录在这里.当然有一种方法可以用msvc2010构建gsl,但是怎么样?我安装了VS 2012 Express(虽然我之前从未使用过),以防有使用它的解决方案.
编辑:看看CMake,我最好能够为GSL手动创建CMakeLists.txt文件的整个层次结构.这只是有点太多,所以我放了100pt.关于上述问题的赏金.解决我的问题Visual Studio路由(这里)或与g ++将得到赏金和两个问题的答案.
更新: 下面的答案工作得很好,但不是无缝的,可能是因为我实际上需要在VS2012下编译.需要对代码进行一些调整,例如显式强制转换,在前一个编译器中显然可以容忍,但不是我的.事情进展顺利.
我在OSX工作,我正在尝试运行一个make文件,当我尝试时,我得到以下内容:
ld: library not found for -lgsl
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [harm] Error 1
Run Code Online (Sandbox Code Playgroud)
之前我发现我需要获取gsl库并使用mac端口并输入:
sudo port install gsl
Run Code Online (Sandbox Code Playgroud)
进入我的命令行窗口,似乎没有问题.丢失的lgsl配置不正确还是没有配备gsl?我试过谷歌搜索lgsl但没有得到太多.我只是在编程几天,我不知道我是否应该设置路径,甚至真的如何做到这一点.
感谢您提供的任何帮助.
我正在尝试gsl为R 安装软件包,我理解这只是GSL的一个包装,在OSX Mavericks下.我试过了明显的事:
> install.packages('gsl')
Installing package into ‘/Users/myusername/Library/R/3.1/library’
(as ‘lib’ is unspecified)
package ‘gsl’ is available as a source package but not as a binary
Warning in install.packages :
package ‘gsl’ is not available (for R version 3.1.0)
Run Code Online (Sandbox Code Playgroud)
所以我跑了
> install.packages('gsl',type = 'source')
Installing package into ‘/Users/myusername/Library/R/3.1/library’
(as ‘lib’ is unspecified)
trying URL 'http://cran.rstudio.com/src/contrib/gsl_1.9-10.tar.gz'
Content type 'application/x-gzip' length 342803 bytes (334 Kb)
opened URL
==================================================
downloaded 334 Kb
* installing *source* package ‘gsl’ ...
** package ‘gsl’ …Run Code Online (Sandbox Code Playgroud)