免责声明
这不是一个严格的编程问题,但大多数程序员很快或后来都要处理数学(特别是代数),所以我认为答案可能会对未来的其他人有用.
现在问题
我试图检查维数n的m个向量是否是线性独立的.如果m == n你可以使用向量建立一个矩阵并检查行列式是否为!= 0.但是如果m <n?
任何提示?
另见本视频讲座.
有人知道这种行为的文档吗?
import numpy as np
A = np.random.uniform(0,1,(10,5))
w = np.ones(5)
Aw = A*w
Sym1 = Aw.dot(Aw.T)
Sym2 = (A*w).dot((A*w).T)
diff = Sym1 - Sym2
Run Code Online (Sandbox Code Playgroud)
diff.max()接近机器精度非零,例如4.4e-16.
这(与0的差异)通常很好......在有限精度的世界里,我们不应该感到惊讶.
此外,我猜想numpy对于对称产品很聪明,可以节省触发器并确保对称输出......
但我处理混乱的系统,这种小的差异在调试时很快变得明显.所以我想确切地知道发生了什么.
python floating-point numpy linear-algebra floating-accuracy
我的几个同行已经提到"线性代数"在研究算法时非常重要.我研究了各种算法,并参加了一些线性代数课程,但我没有看到这种联系.那么算法中如何使用线性代数?
例如,有哪些有趣的东西可以用图表的连接矩阵?
我一直在疯狂地搜索谷歌和Stack Overflow,并且还没有找到任何最近的,完全相关的信息来回答以下问题:什么是最好的C#/ F#/ .NET数学库(特别是那些包装或实现的与Lapack等功能相同)?
我看到的Stack Overflow上最好的帖子之一是:https://stackoverflow.com/questions/3227647/open-source-math-library-for-f
该帖子和其他以前的帖子没有充分回答我的问题的原因是没有给出用户体验与各种图书馆的系统比较.
我对以下库(在实际使用中)如何完全实现Lapack(或一组广泛的功能等效线性代数)感兴趣; 而且,我很好奇他们相对于彼此的表现,特别是在非常大的矩阵上.另外,我想听听其他人利用各种图书馆的经验:困难,易用性等.
下面是"免费"/开源/价格实惠的.NET/F#/ C#数学库的综合列表 - 据我所知 - 它具有线性代数功能集.如果Stack Overflow上的社区能够通过以下库获得任何经验,我将非常感激:
我对于Numerics的F#感兴趣(因为我正在使用F#),但我很难确定各种库的优缺点.比如,哪些功能缺失或包含在各种库中,以及它们的使用方式和执行情况.
DotNumerics似乎是在C#中全面实现Lapack,但我找不到任何人在任何地方分享他们的经验.Math.NET似乎最终可能是一个优秀的,全面的.NET数学库,但很难说它是多么活跃的项目,而且它似乎在当前阶段非常不稳定.Alglib已经说过一两次坚固,但我想听到更多关于它们的信息.我喜欢支持原生F#数字库的想法,但我不确定开发人员(Flying Frog Consultancy)是如何致力于为Numerics支持和开发F#...以及他们计划在1.0版本中包含哪些功能以及他们的目标日期是1.0版本.
在NumPy中,我试图用来linalg计算Newton-Raphson方案每一步的矩阵求逆(问题大小有意为小,以便我们可以反演分析计算的Hessian矩阵).然而,在我走向收敛之后,Hessian接近于单数.
NumPy中是否有任何方法可以让我测试矩阵是否被认为是奇异的(计算行列式不够健壮)?理想情况下,如果有一种方法可以使用try except块来捕获NumPy的奇异数组错误,那将是很好的.
我该怎么做?终端给出的NumPy错误是:
raise LinAlgError, 'Singular matrix'
numpy.linalg.linalg.LinAlgError: Singular matrix
Run Code Online (Sandbox Code Playgroud) 
为了旋转/平移物体(仅绕z轴旋转和仅在xy平面上平移)不仅仅是wrt到全局中心(设备中心)而且还有其他任意点,我创建了一个算法,这是正确的(因为所有高级我已经讨论过的编码器认为它是正确的),但是在实现中删除不需要的翻译需要花费很多时间(算法是在8月4日创建的,并且是在同一天实现的,从那以后代码被修改了15次).
这是http://www.pixdip.com/opengles/transform.php#ALGO1的实现
产生不希望的翻译的代码行在里面:
private static void updateModel(int upDown, float xAngle, float yAngle, float zAngle) {
并列出如下:
Matrix.multiplyMV(GLES20Renderer._uBodyCentreMatrix, 0, GLES20Renderer._ModelMatrixBody, 0, GLES20Renderer._uBodyCentre, 0);
objX = GLES20Renderer._uBodyCentreMatrix[0];
objY = GLES20Renderer._uBodyCentreMatrix[1];
即使进行了以下更改,沿着+ Y的不期望的转换仍然存在:
objY = _uBodyCentreMatrix[1] - _uBodyCentre[1];
zAngle = 0;
ds = 0;
由于Renderer类的这些字段,-0.545867f每次调用时都会将值添加到Y坐标onDrawFrame():
private static final float[] _uBodyCentre = new float[]{-0.019683f, -0.545867f, -0.000409f, 1.0f};
protected static float[] _uBodyCentreMatrix = new float[4];
在http://www.pixdip.com/opengles/transform.php#FIELDS中
我需要帮助才能理解为什么不希望的翻译发生,转换的确切错误,或者算法是错误的.
万向锁可以成为一个问题吗?
请不要让我执行/练习更简单的示例,因为我准备了Renderer类来进行关于全局z轴的旋转/转换,而我所进入的这个新任务使用相同的类,稍作修改 updateModel()
(请注意,所需的旋转仅约为z轴,仅在xy平面内平移)
[API 10-> 15] …
我在MATLAB中有一个函数,它执行Gram-Schmidt正交化,并对内积进行了非常重要的加权(我不认为MATLAB的内置函数支持这一点).据我所知,这个功能效果很好,但是在大型矩阵上它太慢了.改善这种情况的最佳方法是什么?
我已经尝试转换为MEX文件,但我失去了与我正在使用的编译器的并行化,因此它更慢.
我想在GPU上运行它,因为元素倍增是高度并行化的.(但我更喜欢实现方便携带)
任何人都可以将此代码矢量化或加快速度吗?我不确定如何优雅地做到这一点......
我知道这里的stackoverflow思想是惊人的,认为这是一个挑战:)
function [Q, R] = Gram_Schmidt(A, w)
[m, n] = size(A);
Q = complex(zeros(m, n));
R = complex(zeros(n, n));
v = zeros(n, 1);
for j = 1:n
v = A(:,j);
for i = 1:j-1
R(i,j) = sum( v .* conj( Q(:,i) ) .* w ) / ...
sum( Q(:,i) .* conj( Q(:,i) ) .* w );
v = v - R(i,j) * Q(:,i);
end
R(j,j) = norm(v);
Q(:,j) = v / R(j,j);
end …Run Code Online (Sandbox Code Playgroud) optimization performance matlab linear-algebra vectorization
当使用 numpy 计算A @ a其中A是随机 N × N 矩阵并且 a 是具有 N 个随机元素的向量时,计算时间在 N=100 时会跳跃一个数量级。这有什么特别的原因吗?作为比较,在CPU上使用torch进行相同的操作有更逐渐的增加
用 python3.10 和 3.9 和 3.7 尝试过,具有相同的行为
\n用于生成绘图的 numpy 部分的代码:
\nimport numpy as np\nfrom tqdm.notebook import tqdm\nimport pandas as pd\nimport time\nimport sys\n\ndef sym(A):\n return .5 * (A + A.T)\n\nresults = []\nfor n in tqdm(range(2, 500)):\n for trial_idx in range(10):\n A = sym(np.random.randn(n, n))\n a = np.random.randn(n) \n \n t = time.time()\n for i in range(1000):\n A @ a\n …Run Code Online (Sandbox Code Playgroud) 我已经构建了一个小代码,我想用它来解决涉及大型稀疏矩阵的特征值问题.它运行正常,我现在要做的就是将稀疏矩阵中的一些元素设置为零,即最顶行中的元素(对应于实现边界条件).我可以调整下面的列向量(C0,C1和C2)来实现这一点.但是,我想知道是否有更直接的方式.显然,NumPy索引不适用于SciPy的稀疏包.
import scipy.sparse as sp
import scipy.sparse.linalg as la
import numpy as np
import matplotlib.pyplot as plt
#discretize x-axis
N = 11
x = np.linspace(-5,5,N)
print(x)
V = x * x / 2
h = len(x)/(N)
hi2 = 1./(h**2)
#discretize Schroedinger Equation, i.e. build
#banded matrix from difference equation
C0 = np.ones(N)*30. + V
C1 = np.ones(N) * -16.
C2 = np.ones(N) * 1.
diagonals = np.array([-2,-1,0,1,2])
H = sp.spdiags([C2, C1, C0,C1,C2],[-2,-1,0,1,2], N, N)
H *= hi2 * (- 1./12.) …Run Code Online (Sandbox Code Playgroud)