社区首页 >问答首页 >求成对欧氏距离(距离矩阵)的快速算法

求成对欧氏距离(距离矩阵)的快速算法
EN

Stack Overflow用户
提问于 2013-07-21 21:49:50
回答 3查看 5.1K关注 0票数 5

我知道matlab有一个内置的pdist函数,可以计算成对距离。然而,我的矩阵太大了,以至于它的60000乘以300时,matlab耗尽了内存。

这个问题是Matlab euclidean pairwise square distance function的后续问题。

对于这种计算效率低下,有什么解决办法吗?我尝试手动编码成对距离计算,通常需要一整天的时间(有时需要6到7个小时)。

任何帮助都是非常感谢的!

EN

回答 3

Stack Overflow用户

发布于 2013-07-23 00:20:37

好吧,我忍不住要玩了。我创建了一个名为pdistc的Matlab,它实现了单精度和双精度的成对欧几里德距离。在我使用Matlab R2012b和R2015a的机器上,对于大输入(例如,60,000*300),它比pdist(以及底层的pdistmex助手函数)快20-25%。

正如已经指出的,这个问题从根本上受到内存的限制,并且您需要大量的内存。除了输出所需的内存之外,我的mex C代码还使用了最少的内存。将它的内存使用量与pdist进行比较,看起来两者实际上是相同的。换句话说,pdist没有使用很多额外的内存。您的内存问题可能是在调用pdist之前内存耗尽了(您能使用clear删除任何大型数组吗?)或者仅仅是因为你试图在很小的硬件上解决一个大的计算问题。

所以,我的pdistc函数可能不能为您节省全部内存,但是您可以使用我内置的另一个特性。您可以计算总体成对距离向量的块。如下所示:

代码语言:javascript
代码运行次数:0
复制
m = 6e3;
n = 3e2;
X = rand(m,n);
sz = m*(m-1)/2;

for i = 1:m:sz-m
    D = pdistc(X', i, i+m); % mex C function, X is transposed relative to pdist
    ...                     % Process chunk of pairwise distances
end

这是相当慢的(10倍左右),我的C代码的这一部分没有得到很好的优化,但它将允许更少的内存使用-假设你不需要一次使用整个数组。请注意,使用pdist (或pdistc)可以更有效地完成相同的工作,方法是创建一个循环,直接传入X的子集,而不是全部。

如果您使用的是64位Intel Mac,则不需要编译,因为我已经包含了.mexmaci64二进制文件,否则您将需要弄清楚如何为您的机器编译代码。我帮不了你。您可能无法对其进行编译,或者可能存在兼容性问题,您需要通过自己编辑代码来解决这些问题。也有可能存在错误,代码会导致Matlab崩溃。此外,请注意,由于机器ε(eps)的范围不同,您可能会获得与pdist相关的略微不同的输出。pdist可能会做一些花哨的事情,也可能不会做一些花哨的事情来避免大输入溢出和其他数字问题,但要知道我的代码不会。

另外,我创建了一个简单的pure Matlab implementation。它比mex代码慢得多,但仍然比天真的实现或pdist中的代码快。

所有的文件都是can be found here。ZIP存档包括所有文件。这是BSD授权的。请随意优化(我在C代码中尝试了BLAS调用和OpenMP,但都无济于事--也许一些指针魔法或GPU/OpenCL可以进一步提高速度)。我希望它能对你或其他人有所帮助。

票数 6
EN

Stack Overflow用户

发布于 2016-08-25 10:31:10

在我的系统上,下面是最快的(甚至比@horchler编写的C代码pdistc还要快):

代码语言:javascript
代码运行次数:0
复制
function [ mD ] = CalcDistMtx ( mX )    
  vSsqX = sum(mX .^ 2);
  mD = sqrt(bsxfun(@plus, vSsqX.', vSsqX) - (2 * (mX.' * mX)));       
end

我想,你需要一个非常好的C代码来解决这个问题。

更新

因为MATLAB R2016b MATLAB supports implicit broadcasting没有使用bsxfun()

因此,代码可以写成:

代码语言:javascript
代码运行次数:0
复制
function [ mD ] = CalcDistMtx ( mX )    
  vSsqX = sum(mX .^ 2, 1);
  mD = sqrt(vSsqX.'+ vSsqX - (2 * (mX.' * mX)));       
end

在我的Calculate Distance Matrix project中给出了一个概括。

另请注意:

使用MATLAB的pdist进行比较:squareform(pdist(mX.'))等同于CalcDistMtx(mX)

也就是说,输入应该是转置的。

票数 5
EN

Stack Overflow用户

发布于 2013-07-21 22:13:03

计算机不是无限大,也不是无限快。人们认为他们有大量的内存,一个快速的CPU,所以他们只会制造越来越大的问题,然后最终想知道为什么他们的问题运行缓慢。事实是,这并不是计算效率低下。它只是一个过载的CPU。

正如Oli在评论中指出的那样,即使假设您只计算距离矩阵的上半部分或下半部分,也有类似2e9的值需要计算。(6e4^2/2大约是2e9。)这将需要大约16 in的RAM来存储,假设只在内存中创建了数组的一个副本。如果你的代码是草率的,你可以很容易地将其增加一倍或三倍。一旦进入虚拟内存,事情就会变得慢得多。

仅仅想让一个大问题跑得快是不够的。为了真正帮助您,我们需要知道有多少RAM可用。这是一个虚拟内存问题吗?您是否正在使用64位MATLAB,在一个可以处理所有需要的RAM的CPU上?

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

https://stackoverflow.com/questions/17777292

复制
相关文章
Linux 让进程在关闭终端后继续执行
后台进程退出是由于登陆shell收到了SIGHUP信号后在退出前将SIGHUP转发给所有的作业(jobs)。jobs由于收到SIGHUP而终止运行。
白墨石
2021/01/13
2.9K0
【Linux】后台进程
在Linux系统中,后台进程是一种能够在后台运行而不占用终端的进程。理解和有效管理后台进程对于系统管理员和开发者至关重要。本文将深入探讨Linux中的后台进程,包括后台运行的方式、管理后台进程的命令以及一些实用技巧。
人不走空
2024/02/21
4200
Windows安装MySQL提示由于找不到MSVCP120.dll,无法继续执行代码
在一个全新的Windows环境中安装MySQL,结果报错“由于找不到MSVCP120.dll,无法继续执行代码.重新安装程序可能会解决此问题”。
AiDBA宝典
2023/08/09
3890
Windows安装MySQL提示由于找不到MSVCP120.dll,无法继续执行代码
IAR故障解决:由于找不到mfc140u.dll,无法继续执行代码
美好的周一,打开电脑,启动IAR,准备继续解决上周遗留的bug,突然无法启动IAR,出现以下错误:
不脱发的程序猿
2021/03/02
2.7K0
IAR故障解决:由于找不到mfc140u.dll,无法继续执行代码
Tomcat shutdown执行后无法退出进程问题排查及解决
问题定位及排查 上周无意中调试程序在Linux上ps -ef|grep tomcat发现有许多tomcat的进程,当时因为没有影响系统运行就没当回事。而且我内心总觉得这可能是tomcat像nginx一
用户1105954
2018/01/12
2.8K0
[apue] 使用文件记录锁无法实现父子进程交互执行同步
父子进程间交互执行是指用一种同步原语,实现父进程和子进程在某一时刻只有一个进程执行,之后由另外一个进程执行,用一段代码举例如下:
海海
2022/08/19
8330
【Linux网络编程】:守护进程,前台进程,后台进程
●无控制终端:脱离控制终端,避免收到终端的干扰,它是和客户端进行交流的。和Xshell终端摆脱了联系。
用户11396661
2025/02/04
1000
【Linux网络编程】:守护进程,前台进程,后台进程
关于后台执行顺序
前言:了解应用程序移动到后台时执行自定义代码的顺序。 概述: 应用程序可以从几个不同的起点进入到后台,如图1所示。系统事件可以导致一个挂起的应用程序返回到后台,或者导致一个不运行的应用程序直接启动到后
Dwyane
2018/06/13
1.2K0
识别验证码继续爆破后台(三)
有的时候,并不是说所有验证码用api或者tesseract都可以正确识别出来的,还是需要经过相关训练,让tesseract知道你想让它识别出来的验证码。
Jumbo
2018/07/26
1K0
识别验证码继续爆破后台(三)
Python异常处理 -跳过异常继续执行
当循环中出现异常时,如何跳过循环中的异常继续执行,下面是一种可行的方法: import pandas as pd dates=range(20161010,20161114) pieces=[] for date in dates: try: data=pd.read_csv('A_stock/overview-push-%d/stock overview.csv' %date, encoding='gbk') pieces.append(data) exce
py3study
2020/01/06
3.3K0
apisix 如何拦截插件继续往下执行
    core.log.warn("plugin rewrite phase, conf: ", core.json.encode(conf))
空盒子里的巧克力糖
2022/12/02
5220
安装MySQL ,出现由于找不到 MSVCR120.dll,无法继续执行代码解决方法”
目录 1 问题 2 解决 1 问题 2 解决 下载一个工具软件,利用这个软件进行修复 百度云 链接:https://pan.baidu.com/s/1W5SVye5Ist0MHOAnNfCy1w 提取码:walj 安装完成,重启就可以了
一写代码就开心
2022/06/12
7410
安装MySQL ,出现由于找不到 MSVCR120.dll,无法继续执行代码解决方法”
命令执行之绕过防火墙继续执行命令
我们在实战中经常会遇到命令执行漏洞,而由于现在各类waf横行,就会导致我们在执行一些命令时直接被waf拦截,比如执行cat /etc/passwd的时候,直接被拦截了关键字,导致我们无法成功执行。类似于下图这种。
鸿鹄实验室
2021/04/15
1.4K0
命令执行之绕过防火墙继续执行命令
后台JOB监控(前台执行)
REPORT zup. *STATUS = 'R'.运行 'F' 完成 'A' 取消 DATA:message TYPE string. DATA:BEGIN OF gt_job OCCURS 0, jobname TYPE tbtcp-jobname, jobcount TYPE tbtcp-jobcount, status TYPE tbtcp-status, END OF gt_job. INCLUDE ole2incl. DO 10000
古道无仙
2022/01/10
1.1K0
CentOS后台执行命令
查看当前有多少在后台运行的命令 jobs -l选项可显示所有任务的PID,jobs的状态可以是running, stopped, Terminated。但是如果任务被终止了(kill),shell 从当前的shell环境已知的列表中删除任务的进程标识。
码客说
2022/11/22
2.7K0
Perl 程序后台执行示例
自己写示例发现这种方法可以使程序进入后台执行状态,大概原理是 fork 子进程,退出主进程,使得程序被 1 号父进程接管,在终端表现则是进入了后台执行状态。
宋天伦
2023/10/18
1360
Perl 程序后台执行示例
screen后台执行命令
系统管理员经常需要SSH 或者telent 远程登录到Linux 服务器,经常运行一些需要很长时间才能完成的任务,比如系统备份、ftp 传输等等。通常情况下我们都是为每一个这样的任务开一个远程终端窗口,因为它们执行的时间太长了。必须等待它们执行完毕,在此期间不能关掉窗口或者断开连接,否则这个任务就会被杀掉,一切半途而废了。
胡齐
2019/11/12
2.7K0
maven执行单元测试失败后继续
最近在进行sonarqube与maven集成时,如果pom文件配置了sonarqube相关配置,那么在pom文件所在目录执行
johnhuster的分享
2022/03/28
1.8K0
【地平线5打不开(找不到XINPUT1_3.dll,无法继续执行代码)】
如果还剩下几个没有进行修复的话,可以鼠标右键,选择在线修复,一个一个进行修复,即可全部修复完成
magize
2023/07/11
7720
【地平线5打不开(找不到XINPUT1_3.dll,无法继续执行代码)】
【DB宝1】Windows安装MySQL提示由于找不到MSVCP120.dll,无法继续执行代码
在一个全新的Windows环境中安装MySQL,结果报错“由于找不到MSVCP120.dll,无法继续执行代码.重新安装程序可能会解决此问题”。
AiDBA宝典
2021/05/06
1.2K0
【DB宝1】Windows安装MySQL提示由于找不到MSVCP120.dll,无法继续执行代码

相似问题

Bash -读取输出时执行后台进程

10

不能将mplayer作为后台进程执行

10

无法在后台运行进程

20

进程继续启动

10

无法登录系统,只能继续显示“内存中断进程”。

20
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文