标签: linear-algebra

Haskell线性代数?

我开始测试Haskell的线性代数.有没有人为此目的提供最佳套餐的建议?使用Haskell进行基本矩阵操作的任何其他好资源?

haskell wiki 为此列出了几个资源.我目前专注于hmatrixbindings-gsl,两者看起来都很有希望.

haskell matrix linear-algebra gsl

28
推荐指数
1
解决办法
6100
查看次数

Python(NumPy,SciPy),找到矩阵的零空间

我试图找到给定矩阵的零空间(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)

numpy matrix linear-algebra scipy svd

28
推荐指数
4
解决办法
3万
查看次数

带有方向约束的旅行推销员

我试图按顺序沿路径排序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

27
推荐指数
1
解决办法
1131
查看次数

无法理解线性回归的成本函数

我真的无法理解下面的等式,尤其是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)

请解释.如何施展???

math machine-learning linear-algebra

26
推荐指数
1
解决办法
2万
查看次数

代数,数学的Java/Scala库

你能告诉我一些灵活,强大,快速的库,它可以涵盖SciPy(性能和功能).我发现SciPy很有表现力 - 但我想在Scala中尝试一些东西.

我读了一些关于Scala的内容 - 但不像SciPy那样精彩.任何替代品?也许Java库?

java math scala algebra linear-algebra

24
推荐指数
1
解决办法
1万
查看次数

为什么我的翻译矩阵需要转置?

我正在使用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)

c++ opengl glsl matrix linear-algebra

24
推荐指数
1
解决办法
1万
查看次数

使用BLAS实现更快的python内部产品

我发现这个有用的教程是关于使用低级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)

python numpy linear-algebra cython blas

24
推荐指数
1
解决办法
1098
查看次数

Numpy添加两个不同大小的向量

如果我有两个不同大小的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)的最简洁方法是什么?

这是我的一般性问题.对于背景,我特别应用了格林变换函数,并且需要将每个时间步骤的结果叠加到先前累积的响应中.

python numpy linear-algebra

23
推荐指数
2
解决办法
2万
查看次数

奇异矩阵的高效和pythonic检查

在这里研究一些矩阵代数.有时我需要反转可能是单数或病态的矩阵.我知道简单地执行此操作是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只是简单地执行我禁止的测试吗?

python numpy linear-algebra

23
推荐指数
3
解决办法
2万
查看次数

为什么numpy.linalg.solve()提供比numpy.linalg.inv()更精确的矩阵反转?

我不太明白为什么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)给出了更精确的结果.为什么是这样?

究竟发生了什么,使一个"比另一个更好"?

python arrays numpy matrix linear-algebra

23
推荐指数
1
解决办法
1万
查看次数