我有一个对称正定矩阵(例如协方差矩阵),我想计算它的逆矩阵。在数学中,我知道使用 Cholesky 分解来反转矩阵会更有效,特别是当你的矩阵很大时。但我不确定“numpy.lianlg.inv()”是如何工作的。假设我有以下代码:
import numpy as np
X = np.arange(10000).reshape(100,100)
X = X + X.T - np.diag(X.diagonal()) # symmetry
X = np.dot(X,X.T) # positive-definite
# simple inversion:
inverse1 = np.linalg.inv(X)
# Cholesky decomposition inversion:
c = np.linalg.inv(np.linalg.cholesky(X))
inverse2 = np.dot(c.T,c)
Run Code Online (Sandbox Code Playgroud)
哪一个更有效(inverse1 或 inverse2)?如果第二个更有效,为什么 numpy.linalg.inv() 不使用它呢?
我有一个4D数组'a'大小(2,3,4,4)填充零.
import numpy as np
a = np.zeros((2,3,4,4))
Run Code Online (Sandbox Code Playgroud)
我还有一个大小为(2,3,4)的3D数组'b',它带有一些索引值(全部在0到3之间).
我想要做的是将'a'中的每个最后一个数组的元素('a'的第四个维度)替换为'b'中的索引,使用1.
我可以使用3 for循环执行此操作,如下所示:
for i in a.shape[0]:
for j in a.shape[1]:
for z in a.shape[2]:
a[i,j,z][b[i,j,z]] = 1
Run Code Online (Sandbox Code Playgroud)
但我想知道无论如何我都可以避免循环.类似的东西:
a[b] = 1
Run Code Online (Sandbox Code Playgroud) 我有一个5D数组'a',大小(3,2,2,2,2).
import numpy as np
a = np.arange(48).reshape(3,2,2,2,2)
a[0,0,0]:
array([[0, 1],
[2, 3]])
Run Code Online (Sandbox Code Playgroud)
我想要做的是将这个5D阵列旋转180度,但仅在最后两个维度中,不改变它们的位置.所以输出[0,0,0]应如下所示:
out[0,0,0]:
array([[3, 2],
[1, 0]])
Run Code Online (Sandbox Code Playgroud)
我尝试过的:
out = np.rot90(a, 2)
out[0,0,0]:
array([[40, 41],
[42, 43]])
Run Code Online (Sandbox Code Playgroud)
该rot90功能显然可以旋转整个阵列.
注意:如果可能,我想避免使用for循环
我正在尝试为C编写一个编译器(虽然简单的语法).
有些事情我已经坚持了一段时间.如果我没有正确理解,所有二进制操作都是关联的.因此,如果我们有"x + y + z",则首先出现x + y,然后出现加号z.
但是,不执行左关联会导致无限左递归吗?
到目前为止,我检查过的所有解决方案都是左关联的,或者没有左递归,但不是两者都有.是否可以使用具有这两种属性的语法.它甚至可能吗?
例:
左联想:
Expr = Term | Expr + Term
Term = Element | Term ? Element
Element = x|y|z|(Expr)
Run Code Online (Sandbox Code Playgroud)
左递归消除:
Expr = Term ExprTail
ExprTail = epsilon | + Term ExprTail
Term = Element TermTail
TermTail = epsilon | * Element TermTail
Element = x|y|z|(Expr)
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?
我想获取 llvm 中每条指令的后继者列表。如果我理解正确的话,对于除分支 (br) 之外的所有指令,后继指令是下一条指令。但对于分支指令来说有点棘手。
例如,如果我有以下 C 代码:
int main() {
int a = 7;
int b = a * 2;
int x;
if (a < 3) {
x = 10 + b;
} else {
x = 20 + a;
}
return b;
Run Code Online (Sandbox Code Playgroud)
}
我得到以下字节码:
define i32 @main() #0 {
%1 = mul nsw i32 7, 2
%2 = icmp slt i32 7, 3
br i1 %2, label %3, label %5
; <label>:3: ; preds = %0
%4 = …Run Code Online (Sandbox Code Playgroud)