我开始测试Haskell的线性代数.有没有人为此目的提供最佳套餐的建议?使用Haskell进行基本矩阵操作的任何其他好资源?
haskell wiki 为此列出了几个资源.我目前专注于hmatrix和bindings-gsl,两者看起来都很有希望.
我试图找到给定矩阵的零空间(Ax = 0的解空间).我找到了两个例子,但我似乎无法工作.而且,我无法理解他们为实现目标所做的工作,所以我无法调试.我希望有人能够指引我完成这件事.
文档页面(numpy.linalg.svd,和numpy.compress)对我来说是不透明的.我通过创建矩阵C = [A|0],找到减少的行梯形形式并按行求解变量来学习.在这些例子中,我似乎无法遵循它是如何完成的.
感谢您的帮助!
这是我的示例矩阵,它与维基百科示例相同:
A = matrix([
[2,3,5],
[-4,2,3]
])
Run Code Online (Sandbox Code Playgroud)
import scipy
from scipy import linalg, matrix
def null(A, eps=1e-15):
u, s, vh = scipy.linalg.svd(A)
null_mask = (s <= eps)
null_space = scipy.compress(null_mask, vh, axis=0)
return scipy.transpose(null_space)
Run Code Online (Sandbox Code Playgroud)
当我尝试它时,我得到一个空矩阵:
Python 2.6.6 (r266:84292, Sep 15 2010, 16:22:56)
[GCC 4.4.5] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import scipy
>>> …Run Code Online (Sandbox Code Playgroud) 我试图按顺序沿路径排序3D坐标数组.一个样品:
points = np.array([[ 0.81127451, 0.22794118, 0.52009804],
[ 0.62986425, 0.4546003 , 0.12971342],
[ 0.50666667, 0.41137255, 0.65215686],
[ 0.79526144, 0.58186275, 0.04738562],
[ 0.55163399, 0.49803922, 0.24117647],
[ 0.47385621, 0.64084967, 0.10653595]])
Run Code Online (Sandbox Code Playgroud)
这些点是随机顺序的,但总是有一条通过它们的路径.我正在使用LKH解算器(Helsgaun 2009)找到适应旅行商问题(TSP)的路径.它涉及两个修改:
请注意,TSP不涉及位置,只涉及节点之间的距离.所以求解者确实"知道"(或关心)我在3D中工作.我只是像这样制作一个距离矩阵:
import numpy as np
from scipy.spatial.distance import pdist, squareform
# Add a point near the origin.
points = np.vstack([[[0.25, 0, 0.5]], points])
dists = squareform(pdist(points, 'euclidean'))
# Normalize to int16s because the solver likes it.
d = 32767 * …Run Code Online (Sandbox Code Playgroud) python numpy linear-algebra traveling-salesman graph-algorithm
我真的无法理解下面的等式,尤其是1/(2m).
这个等式的目的是什么?哪里1/(2m)来了?
J(theta_0, theta_1) = 1/(2m) * sum_(i=1)^m [ h_theta(x^i) - y^i ]^2
Run Code Online (Sandbox Code Playgroud)
请解释.如何施展???
你能告诉我一些灵活,强大,快速的库,它可以涵盖SciPy(性能和功能).我发现SciPy很有表现力 - 但我想在Scala中尝试一些东西.
我读了一些关于Scala的内容 - 但不像SciPy那样精彩.任何替代品?也许Java库?
我正在使用OpenGL开发一个小型图形引擎,我的翻译矩阵存在一些问题.我正在使用OpenGL 3.3,GLSL和C++.情况是这样的:我已经定义了一个我想在屏幕上呈现的小立方体.立方体使用它自己的坐标系,所以我创建了一个模型矩阵来转换立方体.为了让自己更容易一点,我开始只使用一个平移矩阵作为立方体的模型矩阵,经过一些编码后,我设法使一切正常,立方体出现在屏幕上.没有什么特别的,但我的翻译矩阵有一点我发现有点奇怪.
据我所知,翻译矩阵的定义如下:
1, 0, 0, x
0, 1, 0, y
0, 0, 1, z
0, 0, 0, 1
Run Code Online (Sandbox Code Playgroud)
但是,这对我不起作用.当我以这种方式定义翻译矩阵时,屏幕上不会显示任何内容.它只在我定义我的翻译矩阵时才有效:
1, 0, 0, 0
0, 1, 0, 0
0, 0, 1, 0
x, y, z, 1
Run Code Online (Sandbox Code Playgroud)
现在我已经多次查看我的代码了解为什么会出现这种情况,但我似乎无法找出原因,或者我只是错了,是否需要像上面的转置矩阵那样定义转换矩阵?
我的矩阵定义为从左到右,从上到下的一维数组.
以下是我的一些代码可能会有所帮助:
//this is called just before cube is being rendered
void DisplayObject::updateMatrices()
{
modelMatrix = identityMatrix();
modelMatrix = modelMatrix * translateMatrix( xPos, yPos, zPos );
/* update modelview-projection matrix */
mvpMatrix = modelMatrix * (*projMatrix);
}
//this creates my translation matrix which …Run Code Online (Sandbox Code Playgroud) 我发现这个有用的教程是关于使用低级BLAS函数(在Cython中实现)来获得比python中标准的numpy线性代数例程更快的速度.现在,我已成功地使矢量产品正常工作.首先,我保存以下内容linalg.pyx:
import cython
import numpy as np
cimport numpy as np
from libc.math cimport exp
from libc.string cimport memset
from scipy.linalg.blas import fblas
REAL = np.float64
ctypedef np.float64_t REAL_t
cdef extern from "/home/jlorince/flda/voidptr.h":
void* PyCObject_AsVoidPtr(object obj)
ctypedef double (*ddot_ptr) (const int *N, const double *X, const int *incX, const double *Y, const int *incY) nogil
cdef ddot_ptr ddot=<ddot_ptr>PyCObject_AsVoidPtr(fblas.ddot._cpointer) # vector-vector multiplication
cdef int ONE = 1
def vec_vec(syn0, syn1, size):
cdef int lSize = …Run Code Online (Sandbox Code Playgroud) 如果我有两个不同大小的numpy数组,我怎么能叠加它们.
a = numpy([0, 10, 20, 30])
b = numpy([20, 30, 40, 50, 60, 70])
Run Code Online (Sandbox Code Playgroud)
添加这两个向量以生成新向量(20,40,60,80,60,70)的最简洁方法是什么?
这是我的一般性问题.对于背景,我特别应用了格林变换函数,并且需要将每个时间步骤的结果叠加到先前累积的响应中.
在这里研究一些矩阵代数.有时我需要反转可能是单数或病态的矩阵.我知道简单地执行此操作是pythonic:
try:
i = linalg.inv(x)
except LinAlgErr as err:
#handle it
Run Code Online (Sandbox Code Playgroud)
但我不确定它的效率如何.这会不会更好?
if linalg.cond(x) < 1/sys.float_info.epsilon:
i = linalg.inv(x)
else:
#handle it
Run Code Online (Sandbox Code Playgroud)
numpy.linalg只是简单地执行我禁止的测试吗?
我不太明白为什么numpy.linalg.solve()给出更准确的答案,而numpy.linalg.inv()在某种程度上分解,给出(我相信的)估计.
举一个具体的例子,我正在求解方程式C^{-1} * d ,其中C表示一个矩阵,并且d是一个向量数组.为了便于讨论,尺寸C是形状(1000,1000)和d形状(1,1000).
numpy.linalg.solve(A, b)求解A*x=bx 的等式,即x = A^{-1} * b.因此,我可以通过求解这个等式
(1)
inverse = numpy.linalg.inv(C)
result = inverse * d
Run Code Online (Sandbox Code Playgroud)
或(2)
numpy.linalg.solve(C, d)
Run Code Online (Sandbox Code Playgroud)
方法(2)给出了更精确的结果.为什么是这样?
究竟发生了什么,使一个"比另一个更好"?