如何确定矩阵在R中是否有倒数?
因此在R中有一个带矩阵输入的函数,会返回一些像:
" TRUE "(此矩阵具有反转)/" FALSE "(它没有......).
通常我会在for循环中反转一个3x3矩阵的数组,如下例所示.不幸的是for循环很慢.有没有更快,更有效的方法来做到这一点?
import numpy as np
A = np.random.rand(3,3,100)
Ainv = np.zeros_like(A)
for i in range(100):
Ainv[:,:,i] = np.linalg.inv(A[:,:,i])
Run Code Online (Sandbox Code Playgroud) 我发现很难理解在Hill Cipher算法中计算矩阵的逆矩阵的方式.我知道这一切都是在模运算中完成的,但不知怎的,事情并没有增加.我真的很感激一个简单的解释!
考虑以下Hill Cipher密钥矩阵:
5 8
17 3
Run Code Online (Sandbox Code Playgroud)
请使用上面的矩阵进行说明.
在MATLAB中计算某些方阵A的逆时,使用
Ai = inv(A)
% should be the same as:
Ai = A^-1
Run Code Online (Sandbox Code Playgroud)
MATLAB通常会通知我这不是最有效的反转方式.那么什么更有效?如果我有一个方程式系统,可能使用/,\运算符.但有时我需要其他计算的逆.
反转最有效的方法是什么?
我正在使用来自神经成像的数据,并且由于数据量很大,我想对我的代码使用稀疏矩阵(scipy.sparse.lil_matrix或csr_matrix).
特别是,我需要计算矩阵的伪逆以解决最小二乘问题.我找到了sparse.lsqr方法,但效率不高.有没有一种方法来计算Moore-Penrose的伪逆(对应于正常矩阵的pinv).
我的矩阵A的大小约为600'000x2000,并且在矩阵的每一行中,我将具有0到4非零值.矩阵A的大小由体素x纤维束(白质纤维束)给出,我们期望在体素中最多穿过4个束.在大多数白质体素中,我们预计至少有1个道,但我会说大约20%的线可能是零.
向量b不应该是稀疏的,实际上b包含每个体素的度量,通常不是零.
我需要最小化错误,但是向量x上也存在一些条件.当我在较小的矩阵上尝试模型时,我从不需要约束系统以满足这些条件(通常为0
有什么帮助吗?有没有办法避免采取A的伪逆?
谢谢
6月1日更新: 再次感谢您的帮助.我无法向你展示我的数据,因为python中的代码给了我一些问题.但是,为了理解我如何选择一个好的k,我试图在Matlab中创建一个测试函数.
代码如下:
F=zeros(100000,1000);
for k=1:150000
p=rand(1);
a=0;
b=0;
while a<=0 || b<=0
a=random('Binomial',100000,p);
b=random('Binomial',1000,p);
end
F(a,b)=rand(1);
end
solution=repmat([0.5,0.5,0.8,0.7,0.9,0.4,0.7,0.7,0.9,0.6],1,100);
size(solution)
solution=solution';
measure=F*solution;
%check=pinvF*measure;
k=250;
F=sparse(F);
[U,S,V]=svds(F,k);
s=svds(F,k);
plot(s)
max(max(U*S*V'-F))
for s=1:k
if S(s,s)~=0
S(s,s)=1/S(s,s);
end
end
inv=V*S'*U';
inv*measure
max(inv*measure-solution)
Run Code Online (Sandbox Code Playgroud)
你知道与F的大小相比应该是什么?我已经花了250(超过1000)并且结果不令人满意(等待时间可以接受,但不是很短).现在我也可以将结果与已知的解决方案进行比较,但是如何选择k呢?我还附上了我获得的250个单值的图,并将它们的正方形归一化.我不知道如何更好地在matlab中做一个screeplot.我现在正在进行更大的k,以确定是否会突然显示该值会小得多.
再次感谢,珍妮弗

python linear-algebra sparse-matrix matrix-inverse least-squares
在本征,如果我们有对称正定矩阵A那么我们就可以计算出的逆A由
A.inverse();
Run Code Online (Sandbox Code Playgroud)
或者
A.llt().solve(I);
Run Code Online (Sandbox Code Playgroud)
其中I是与 大小相同的单位矩阵A。但是有没有更有效的方法来计算对称正定矩阵的逆矩阵?
例如,如果我们写出Aas的 Cholesky 分解A = LL^{T},则L^{-T} L^{-1}是Asince的逆A L^{-T} L^{-1} = LL^{T} L^{-T} L^{-1} = I(并且 whereL^{-T}表示 的转置的逆L)。
所以我们可以得到 的 Cholesky 分解A,计算它的逆,然后得到逆的叉积来找到 的逆A。但我的直觉是,计算这些显式步骤会比使用A.llt().solve(I)上述方法慢。
在有人问之前,我确实需要一个显式逆 - 它是 Gibbs 采样器的一部分的计算。
计算对称密集矩阵(2000 * 2000)的逆对角线的最佳方法是什么?目前我首先计算逆solve(x),然后提取对角线(diag(y)).即使它有效,但我想知道是否有更好的方法来做到这一点,所以代码运行得更快.我尝试过,chol2inv()但由于我的矩阵不是正确的,所以它没有用.
更新:对于任何可能感兴趣的人,我都可以通过使用优化的数学库英特尔MKL来加速矩阵求逆.在我的机器上反转2000*2000矩阵需要3秒钟.英特尔MKL适用于Microsoft R Open.
我需要AB?¹在 Python/Numpy 中计算两个矩阵A和B(B当然是正方形)。
我知道这np.linalg.inv()可以让我计算B?¹,然后我可以乘以A。我也知道,B?¹A实际上是更好地与计算np.linalg.solve()。
受此启发,我决定AB?¹用np.linalg.solve(). 我得到了一个基于身份 的公式(AB)? = B?A?,它使用np.linalg.solve()和.transpose():
np.linalg.solve(a.transpose(), b.transpose()).transpose()
Run Code Online (Sandbox Code Playgroud)
这似乎在做这项工作:
import numpy as np
n, m = 4, 2
np.random.seed(0)
a = np.random.random((n, n))
b = np.random.random((m, n))
print(np.matmul(b, np.linalg.inv(a)))
# [[ 2.87169378 -0.04207382 -1.10553758 -0.83200471]
# [-1.08733434 1.00110176 0.79683577 0.67487591]]
print(np.linalg.solve(a.transpose(), b.transpose()).transpose())
# [[ 2.87169378 -0.04207382 …Run Code Online (Sandbox Code Playgroud) 我有一个对称矩阵.现在,问题在于我需要填充这样的维度矩阵(32**3) x (32**3).我需要填充矩阵的原因是因为在我的程序中我使用它进行各种计算:我正在反转它,我将它与其他矩阵相乘......在我看来,为了执行这些各种你需要实际存储完整矩阵的计算,你不能使用例如只有一半(但我可能是错的,在这种情况下请告诉我应该怎么做).
问题是这样的矩阵对于我的计算机来说太大了,我得到以下错误:
Traceback (most recent call last):
File "program.py", line 191, in <module>
A = zeros((n_x*n_y*n_z. n_x*n_y*n_z), float)
MemoryError
Run Code Online (Sandbox Code Playgroud)
在这里,n_x = 32.那么,我该如何解决这个问题呢?有没有办法存储这么大的矩阵,或者是一种避免存储它的聪明方法?如果我可以使用它们而不会在计算中出错,那么这两种方式对我来说都没问题.
为了完整起见,我在下面报告A矩阵的构建方式:
n_x = n_y = n_z = 32
L_x = L_y = L_z = n_x
A = zeros((n_x*n_y*n_z , n_x*n_y*n_z), float)
P_0 = 50.0
sigma_x = sigma_y = sigma_z = 0.9
sigma_root = np.sqrt(sigma_x**2 + sigma_y**2 + sigma_z**2)
twosigmasquared = 2.*sigma_root**2
for l in range(n_x*n_y*n_z):
for m in range(n_x*n_y*n_z):
A[l][m] …Run Code Online (Sandbox Code Playgroud) python symmetric matrix-inverse bigdata matrix-multiplication
matrix-inverse ×10
python ×5
matrix ×2
numpy ×2
r ×2
algorithm ×1
bigdata ×1
c++ ×1
cryptography ×1
eigen ×1
encryption ×1
matlab ×1
symmetric ×1