我有以下ruby脚本,在ruby-2.2.1下使用rb-gsl(1.16.0.6)运行
require("gsl")
include GSL
m = GSL::Matrix::alloc([0.18, 0.60, 0.57], [0.24, 0.99, 0.58],
[0.14, 0.30, 0.97], [0.51, 0.19, 0.85], [0.34, 0.91, 0.18])
B = GSL::Vector[1, 2, 3, 4, 5]
qr, tau = m.QR_decomp
x, res = qr.QR_lssolve(tau,B)
产生的错误是:
testls.rb:9:在QR_lssolve中:Ruby / GSL错误代码19,矩阵大小必须匹配>解决方案大小(文件qr.c,第193行),矩阵/向量大小不符合 (GSL ::错误:: EBADLEN) 来自testls.rb:9:in
我认为我的矩阵对于过度确定的LS问题具有正确的维度,因此我无法理解错误消息。
在Matlab中,我可以写:
m=[[0.18, 0.60, 0.57]; [0.24, 0.99, 0.58];...
[0.14, 0.30, 0.97]; [0.51, 0.19, 0.85]; [0.34, 0.91, 0.18]];
B=[1, 2, 3, 4, 5]';
x=m\B
并获取
x =
8.0683
0.8844
0.2319
我想使矩阵/矢量大小符合要求并仍然表达一个过分确定的问题。从GSL文档中可以看出
gsl_linalg_QR_lssolve (const gsl_matrix * QR, const gsl_vector * tau, const
gsl_vector * b, gsl_vector * x, gsl_vector * residual)
非常适合手头的任务,因此破坏了对Ruby的绑定还是我对正确用法的理解?所有帮助将不胜感激。
答案 0 :(得分:0)
回答我自己的问题:似乎你必须预先为解决方案x和残差分配矢量并将它们作为参数传递:
require("gsl")
include GSL
m = GSL::Matrix::alloc([0.18, 0.60, 0.57], [0.24, 0.99, 0.58],
[0.14, 0.30, 0.97], [0.51, 0.19, 0.85], [0.34, 0.91, 0.18])
B = GSL::Vector[1, 2, 3, 4, 5]
qr, tau = m.QR_decomp
x = GSL::Vector.alloc(3)
r = GSL::Vector.alloc(5)
qr.QR_lssolve(tau,B,x,r)
p x
这确实产生了
GSL::Vector
[ 8.068e+00 8.844e-01 2.319e-01 ]
查尔斯。