谢谢您的帮助。使用Python(主要是numpy),我正在尝试计算一个上三角矩阵,其中每一行“j”都是几何级数的前j项,所有行都使用相同的参数。
例如,如果我的参数是B(其中abs(B)=<1,即B在[-1,1]范围内),那么第一行将是[1 B B ^ 2 B ^ 3 ... B ^(N-1)],第二行将是[0 1 B B ^ 2 ... B ^(N-2)] ...第N行将是[0 0 0 ... 1]。
这个计算对于贝叶斯Metropolis-Gibbs采样器非常关键,因此需要为“B”的新值重复执行数千次。
目前我已经尝试了两种方法:
方法1 - 大多数向量化:
例如,如果我的参数是B(其中abs(B)=<1,即B在[-1,1]范围内),那么第一行将是[1 B B ^ 2 B ^ 3 ... B ^(N-1)],第二行将是[0 1 B B ^ 2 ... B ^(N-2)] ...第N行将是[0 0 0 ... 1]。
这个计算对于贝叶斯Metropolis-Gibbs采样器非常关键,因此需要为“B”的新值重复执行数千次。
目前我已经尝试了两种方法:
方法1 - 大多数向量化:
B_Matrix = np.triu(np.dot(np.reshape(B**(-1*np.array(range(N))),(N,1)),np.reshape(B**(np.array(range(N))),(1,N))))
本质上, 这是一个Nx1矩阵和1xN矩阵相乘的上三角部分:
上三角 ([1 B^(-1) B^(-2) ... B^(-(N-1))]' * [1 B B^2 B^3 ... B^(N-1)])
这个方法在小N时很好用 (代数上是正确的), 但是对于大的N它会出现错误。而且当B=0时也会出现错误 (但实际上应该是允许的)。我相信这是因为对于小的B和大的N,B^(-N) ~ inf导致的。
方法二:
B_Matrix = np.zeros((N,N))
B_Row_1 = B**(np.array(range(N)))
for n in range(N):
B_Matrix[n,n:] = B_Row_1[0:N-n]
这样的方法按行填充矩阵,但使用了循环,这会减慢计算速度。
我想知道是否有人遇到过这种情况,或者有更好的方法来更快地计算这个矩阵。
我以前从未在stackoverflow上发过帖子,但没有看到这个问题,所以想问一下。
如果有更好的地方可以询问此事,请告诉我,并且如果需要提供更多细节,请告诉我。
cython
函数能够达到多快。如果还不够快,你仍然可以选择完全用C
编写此函数,并将其集成到你的 Python 代码中。 - cel