标签: linear-algebra

什么是最广泛使用的C++向量/矩阵数学/线性代数库,以及它们的成本和收益权衡?

似乎许多项目慢慢需要进行矩阵数学运算,并陷入首先构建一些向量类并慢慢添加功能的陷阱,直到它们被捕获构建一个半定制的自定义线性代数库,并依赖于它.

我想避免这种情况,而不依赖于一些切向相关的库(例如OpenCV,OpenSceneGraph).

有哪些常用的矩阵数学/线性代数库,为什么会决定使用另一个?有什么建议不要因某些原因使用?我特意在几何/时间上下文*(2,3,4 Dim)*中使用它,但将来可能会使用更高维数据.

我正在寻找以下任何方面的差异:API,速度,内存使用,广度/完整性,狭窄/特异性,可扩展性和/或成熟度/稳定性.

更新

我最终使用了Eigen3,我非常满意.

c++ math matrix linear-algebra

235
推荐指数
8
解决办法
14万
查看次数

"克隆"行或列向量

有时将行或列向量"克隆"到矩阵是有用的.通过克隆我的意思是转换行向量,如

[1,2,3]
Run Code Online (Sandbox Code Playgroud)

进入矩阵

[[1,2,3]
 [1,2,3]
 [1,2,3]
]
Run Code Online (Sandbox Code Playgroud)

或列向量,如

[1
 2
 3
]
Run Code Online (Sandbox Code Playgroud)

[[1,1,1]
 [2,2,2]
 [3,3,3]
]
Run Code Online (Sandbox Code Playgroud)

在matlab或octave中,这很容易完成:

 x = [1,2,3]
 a = ones(3,1) * x
 a =

    1   2   3
    1   2   3
    1   2   3

 b = (x') * ones(1,3)
 b =

    1   1   1
    2   2   2
    3   3   3
Run Code Online (Sandbox Code Playgroud)

我想在numpy中重复这个,但没有成功

In [14]: x = array([1,2,3])
In [14]: ones((3,1)) * x
Out[14]:
array([[ 1.,  2.,  3.],
       [ 1.,  2.,  3.],
       [ 1.,  2.,  3.]])
# so far …
Run Code Online (Sandbox Code Playgroud)

python numpy linear-algebra

136
推荐指数
8
解决办法
10万
查看次数

数学 - 映射数字

如何在a和b之间线性地映射数字以在c和d之间进行.

也就是说,我希望2到6之间的数字映射到10到20之间的数字......但我需要一般化的情况.

我的大脑是油炸的.

mapping math interpolation numbers linear-algebra

91
推荐指数
3
解决办法
5万
查看次数

鸡尾酒会算法SVD实现......在一行代码中?

在Stanford的Andrew Ng在Coursera的机器学习入门讲座中的一篇幻灯片中,他给出了以下一行Octave解决方案,因为音频源由两个空间分离的麦克风录制:

[W,s,v]=svd((repmat(sum(x.*x,1),size(x,1),1).*x)*x');
Run Code Online (Sandbox Code Playgroud)

幻灯片的底部是"来源:Sam Roweis,Yair Weiss,Eero Simoncelli",而在之前幻灯片的底部则是"音频片段由Te-Won Lee提供".在视频中,吴教授说,

"所以你可能会看到这样无监督的学习,并问,'实现这个有多复杂?' 看起来为了构建这个应用程序,似乎要做这个音频处理,你会写大量的代码,或者可能链接到一堆处理音频的C++或Java库.看起来它真的是真的执行此音频的复杂程序:分离出音频等等.事实证明算法可以完成您刚刚听到的内容,只需一行代码即可完成...此处显示.确实需要研究人员很长时间想出这一行代码.所以我并不是说这是一个容易出问题的问题.但事实证明,当你使用正确的编程环境时,很多学习算法都会成为很短的程序."

在视频讲座中播放的分离音频结果并不完美,但在我看来,令人惊叹.有没有人知道这一行代码如何表现如此之好?特别是,有没有人知道有关这一行代码的Te-Won Lee,Sam Roweis,Yair Weiss和Eero Simoncelli的工作的参考资料?

UPDATE

为了演示算法对麦克风间隔距离的敏感度,以下模拟(在Octave中)将音调与两个空间分离的音调发生器分开.

% define model 
f1 = 1100;              % frequency of tone generator 1; unit: Hz 
f2 = 2900;              % frequency of tone generator 2; unit: Hz 
Ts = 1/(40*max(f1,f2)); % sampling period; unit: s 
dMic = 1;               % distance between microphones centered about origin; unit: m 
dSrc = 10;              % distance between tone generators centered about origin; unit: m 
c = 340.29;             % speed …
Run Code Online (Sandbox Code Playgroud)

matlab machine-learning linear-algebra octave svd

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

Python的逆矩阵

如何在python中得到矩阵的逆?我自己实现了它,但它是纯粹的python,我怀疑有更快的模块可以做到这一点.

python algorithm matrix linear-algebra matrix-inverse

60
推荐指数
6
解决办法
11万
查看次数

C#线性代数库

C#是否有稳定的线性代数(更具体地说,是矢量,矩阵,多维数组和它们的基本运算)库?

搜索产生了一些开源库,这些库要么未更新几年,要么处于早期测试阶段 - 以及Centerspace NMath.哪些替代品值得检查?

.net c# linear-algebra nmath

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

旋转3D空间中的矢量

我在opengl中制作了一个android项目,它使用加速计来计算特定轴的变化,我的目标是旋转我的类似航天器的物体的运动矢量.问题是我无法理解旋转矩阵背后的数学.默认运动矢量为0,1,0,表示+ y,因此对象在开头向上看.而我正在尝试旋转它的运动矢量,这样我就可以移动它所指向的物体.我可以在手机中收集旋转变化.x轴:旋转[0],y轴:旋转[1],z轴:旋转[2].如何使用旋转矩阵旋转运动矢量?

math 3d vector rotation linear-algebra

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

什么是在python中找到特征值/向量的最快方法?

目前我正在使用numpy来完成这项工作.但是,因为我正在处理具有数千行/列的矩阵,后来这个数字将达到数万,我想知道是否存在可以更快地执行此类计算的包?

python numpy matrix linear-algebra eigenvalue

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

求解线性方程

我需要以编程方式解决C,Objective C或(如果需要)C++中的线性方程组.

这是方程的一个例子:

-44.3940 = a * 50.0 + b * 37.0 + tx
-45.3049 = a * 43.0 + b * 39.0 + tx
-44.9594 = a * 52.0 + b * 41.0 + tx
Run Code Online (Sandbox Code Playgroud)

由此,我想获得最好的逼近a,b以及tx.

math linear-equation system linear-algebra

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

大内存映射数组的高效点积

我正在使用一些相当大的,密集的numpy浮点数组,这些数组目前驻留在PyTables CArray的磁盘上.我需要能够执行使用这些阵列效率点的产物,例如C = A.dot(B),其中A是一个巨大的(〜1E4 X 3E5 FLOAT32)存储器映射阵列,以及BC较小numpy的数组,其驻留在核心存储器.

我现在正在做的是使用数据将数据复制到内存映射的numpy数组中np.memmap,然后np.dot直接调用内存映射数组.这是有效的,但我怀疑标准np.dot(或者它调用的底层BLAS函数)在计算结果所需的I/O操作数量方面可能不是很有效.

我在这篇评论文章中遇到了一个有趣的例子.使用3x嵌套循环计算的天真点积,如下所示:

def naive_dot(A, B, C):
    for ii in xrange(n):
        for jj in xrange(n):
            C[ii,jj] = 0
            for kk in xrange(n):
                C[ii,jj] += A[ii,kk]*B[kk,jj]
    return C
Run Code Online (Sandbox Code Playgroud)

需要O(n ^ 3)个 I/O操作来计算.

但是,通过在适当大小的块中处理数组:

def block_dot(A, B, C, M):
    b = sqrt(M / 3)
    for ii in xrange(0, n, b):
        for jj in xrange(0, n, b):
            C[ii:ii+b,jj:jj+b] = …
Run Code Online (Sandbox Code Playgroud)

python arrays performance numpy linear-algebra

34
推荐指数
3
解决办法
3924
查看次数