计算从向量到向量矩阵的距离

计算科学 张量 距离测量
2021-12-03 15:36:05

aRα, 然后让H是具有维度的 3 阶张量M[iN]×N[jN]×α[kN](其中下标是每个维度的索引)。

我们可以类似地看一下张量H作为矩阵H其中每个元素都是一个Rα向量。

我希望计算一个规范(例如,让我们说22范数,这里平方只是为了避免在计算差异后取根)向量与矩阵aH

一个简单的算法(以没有numpy的python为例)可以表示为:

D = [[0 for i in range(M)] for j in range(N)]
for i in range(M):
    for j in range(N):
        norm = 0
        for k in range(alpha):
            norm += (a[k] - H[i][j][k])**2
        D[i][j] == norm

数学上我们可以写成:

Di,j=Hi,ja22=k=1α(Hi,jkak)2

我的问题是:

  1. 有什么数学运算可以更清楚地表达这一点吗?任何可以更简洁地表达的矩阵/张量运算?

  2. 是否有更好的算法,这种计算方法?由于我将使用大向量运行大张量,因此我将计算到许多输入向量的距离。我的想法是使用 gpus 进行优化,可能使用 tensorflow。

1个回答

这将是一个受 IO 限制的操作,因此在寻找替代方案方面几乎没有实际优势。您可以做两件事来加快速度:

  1. 选择索引和 for 循环的顺序以确保内存访问尽可能连续。在您的情况下(假设 Fortran 样式的内存布局,这应该是 Python 所做的,并且假设a占用的空间比 少D),我认为您想要重塑H以便这k是第一个索引,然后您想要交换和的i顺序j循环。
  2. 编译那个循环。你使用什么语言并不重要,Cython、Numba、Tensorflow(当然,在适当的条件下,使用 GPU 可能很重要)、C、Julia 等等。只是不是普通的解释型弱类型 Python。

作为手动执行 2 的替代方法,请查看是否可以找到为您执行此操作的库函数。例如,一个快速的谷歌搜索返回scipy.spatial.distance.cdist,但我不知道它是否已经编译并且足够快以满足您的目的。

Matlab 用户会告诉您使用bsxfun或减法,单例扩展reshape(a, [1,1,length(a)]) - H后跟vecnorm,这可能是您在 Matlab 中可以做的最快的事情,但仍然不是最佳的,因为它循环两次。H