如何有效地计算嵌套循环中上三角的logsexpexp?

时间:2019-01-04 01:16:07

标签: python numpy matrix vectorization linear-algebra

我有一个嵌套的for循环,该循环在权重矩阵的行上进行迭代,并从这些权重行将logumexp应用于外部加法矩阵的上三角部分。它非常慢,所以我试图找出如何通过向量化或取出循环来代替矩阵运算来加快速度的方法。

'''
Wm: weights matrix, nxk
W: updated weights matrix, nxn
triu_inds: upper triangular indices of Wxy outer matrix
'''

for x in range(n-1):
    wx = Wm[x, :]
    for y in range(x+1, n):
        wy = Wm[y, :]
        Wxy = np.add.outer(wx, wy)
        Wxy = Wxy[triu_inds]
        W[x, y] = logsumexp(Wxy)

logsumexp:计算输入数组的指数和的对数

a: [1, 2, 3]
logsumexp(a) = log( exp(1) + exp(2) + exp(3) )

输入数据Wm是nxk维的权重矩阵。 K代表患者传感器位置,n代表所有可能的传感器位置。 Wm中的值基本上是患者传感器与已知传感器的距离。

示例:

Wm  = [1   2   3]
      [4   5   6]
      [7   8   9]
      [10 11  12]

wx  = [1   2   3]
wy  = [4   5   6]

Wxy = [5   6   7]
      [6   7   8]
      [7   8   9]

triu_indices = ([0, 0, 1], [1, 2, 2])
Wxy[triu_inds] = [6, 7, 8]
logsumexp(Wxy[triu_inds]) = log(exp(6) + exp(7) + exp(8))

1 个答案:

答案 0 :(得分:3)

您可以在完整矩阵#include <stdio.h> struct mystruct { int enabled:1; }; int main() { mystruct s; <-- Get rid of "struct" type declaration s.enabled = 1; if(s.enabled == 1) printf("Is enabled\n"); // --> we think this to be printed else printf("Is disabled !!\n"); } 上执行外积,然后交换与操作数1中的列和操作数2中的行相对应的轴,以便将三角形索引应用于列。对于所有行组合,结果矩阵都会被填充,因此您需要选择上部三角形部分。

Wm