似乎许多项目慢慢需要进行矩阵数学运算,并陷入首先构建一些向量类并慢慢添加功能的陷阱,直到它们被捕获构建一个半定制的自定义线性代数库,并依赖于它.
我想避免这种情况,而不依赖于一些切向相关的库(例如OpenCV,OpenSceneGraph).
有哪些常用的矩阵数学/线性代数库,为什么会决定使用另一个?有什么建议不要因某些原因使用?我特意在几何/时间上下文*(2,3,4 Dim)*中使用它,但将来可能会使用更高维数据.
我正在寻找以下任何方面的差异:API,速度,内存使用,广度/完整性,狭窄/特异性,可扩展性和/或成熟度/稳定性.
我最终使用了Eigen3,我非常满意.
有时将行或列向量"克隆"到矩阵是有用的.通过克隆我的意思是转换行向量,如
[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) 如何在a和b之间线性地映射数字以在c和d之间进行.
也就是说,我希望2到6之间的数字映射到10到20之间的数字......但我需要一般化的情况.
我的大脑是油炸的.
在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) 如何在python中得到矩阵的逆?我自己实现了它,但它是纯粹的python,我怀疑有更快的模块可以做到这一点.
C#是否有稳定的线性代数(更具体地说,是矢量,矩阵,多维数组和它们的基本运算)库?
搜索产生了一些开源库,这些库要么未更新几年,要么处于早期测试阶段 - 以及Centerspace NMath.哪些替代品值得检查?
我在opengl中制作了一个android项目,它使用加速计来计算特定轴的变化,我的目标是旋转我的类似航天器的物体的运动矢量.问题是我无法理解旋转矩阵背后的数学.默认运动矢量为0,1,0,表示+ y,因此对象在开头向上看.而我正在尝试旋转它的运动矢量,这样我就可以移动它所指向的物体.我可以在手机中收集旋转变化.x轴:旋转[0],y轴:旋转[1],z轴:旋转[2].如何使用旋转矩阵旋转运动矢量?
目前我正在使用numpy来完成这项工作.但是,因为我正在处理具有数千行/列的矩阵,后来这个数字将达到数万,我想知道是否存在可以更快地执行此类计算的包?
我需要以编程方式解决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.
我正在使用一些相当大的,密集的numpy浮点数组,这些数组目前驻留在PyTables CArray的磁盘上.我需要能够执行使用这些阵列效率点的产物,例如C = A.dot(B),其中A是一个巨大的(〜1E4 X 3E5 FLOAT32)存储器映射阵列,以及B和C较小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)