首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >计算两个三维矩阵单元间有效距离的有效方法

计算两个三维矩阵单元间有效距离的有效方法
EN

Stack Overflow用户
提问于 2018-03-26 08:49:25
回答 2查看 1.1K关注 0票数 0

我有两个三维矩阵。matrix1=dim(15,3)matrix2=dim(23,3).

例如:

代码语言:javascript
运行
复制
matrix1=[[5,7,8],
[10,6,8],
...
...
...,
[11,14,78]]

代码语言:javascript
运行
复制
matrix2=[[3,7,9],
[12,11,18],
...,
...,
[78,99,10]]

输出是什么?

为了便于说明,让我们只考虑第一个通道和第一行:

代码语言:javascript
运行
复制
matrix_distance[:,:,0]=[(5-3)^2, (5-12)^2, ..., (5-78)^2]

什么是有效的和矢量化的方法来计算它?

EDIT1:

非矢量化解

代码语言:javascript
运行
复制
for i in np.arange(len(matrix1)):
    for j in np.arange(len(matrix2)):
        for channel in np.arange(matrix1[0,0,:]):
            matrix_distance[i,:,p]=(matrix1[i,:,p]-matrix2[j,:,p])^2

a=[5,7,8]

b=[3,7,9,3,7,9,78,99,10]

然后

代码语言:javascript
运行
复制
c=[[(5-3)^2,(7-7)^2,(8-9)^2],[(5-3)^2,(7-7)^2,(8-9)^2],[(5-78)^2,(7-99)^2,(8-10)^2]]
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-03-26 11:07:55

使用cdist

代码语言:javascript
运行
复制
In [8]: cdist(matrix1,matrix2).shape
Out[8]: (15, 23)
票数 1
EN

Stack Overflow用户

发布于 2018-03-26 11:43:03

另外,您也可以使用Numba,它提供了更好的性能。还可以考虑使用32位浮点数进行计算,如果这满足您的精度要求。

代码语言:javascript
运行
复制
import numpy as np
import numba as nb
import time
from scipy.spatial.distance import cdist

#Maybe calculation with 32bit floats is sufficient?
#creating random 32bit floats
vec_1=np.array(np.random.rand(10000,3),dtype=np.float32)
vec_2=np.array(np.random.rand(20000,3),dtype=np.float32)


@nb.njit(fastmath=True,parallel=True)
def calc_distance(vec_1,vec_2):
    assert vec_1.shape[1]==3 #Enable SIMD-Vectorization (adding some performance)
    assert vec_2.shape[1]==3 #Enable SIMD-Vectorization (adding some performance)

    res=np.empty((vec_1.shape[0],vec_2.shape[0]),dtype=vec_1.dtype)
    for i in nb.prange(vec_1.shape[0]):
        for j in range(vec_2.shape[0]):
            res[i,j]=np.sqrt((vec_1[i,0]-vec_2[j,0])**2+(vec_1[i,1]-vec_2[j,1])**2+(vec_1[i,2]-vec_2[j,2])**2)

    return res

t1=time.time()
res=calc_distance(vec_1,vec_2)
print(time.time()-t1)
t1=time.time()
A=cdist(vec_1,vec_2) #cdist approach
print(time.time()-t1)

这给出了一个四核I7-4代0.25s (Numba),1.3s cdist。64位精度的计算结果为0.44s (Numba)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49487399

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档