matlab的点平方,性能 – 有效地计算Matlab中的成对平方欧几里德距离
这里通常给出的答案是基于bsxfun(参见例如
[1]).我提出的方法是基于矩阵乘法,结果比我可以找到的任何可比较的算法快得多:
helpA = zeros(numA,3*d);
helpB = zeros(numB,3*d);
for idx = 1:d
helpA(:,3*idx-2:3*idx) = [ones(numA,1), -2*A(:,idx), A(:,idx).^2 ];
helpB(:,3*idx-2:3*idx) = [B(:,idx).^2 , B(:,idx), ones(numB,1)];
end
distMat = helpA * helpB';
请注意:
对于常数d,可以通过硬编码实现来代替for-loop.
helpA(:,3*idx-2:3*idx) = [ones(numA,1), -2*A(:,1), A(:,1).^2, ... % d == 2
ones(numA,1), -2*A(:,2), A(:,2).^2 ]; % etc.
评价:
%% create some points
d = 2; % dimension
numA = 20000;
numB = 20000;
A = rand(numA,d);
B = rand(numB,d);
%% pairwise distance matrix
% proposed method:
tic;
helpA = zeros(numA,3*d);
helpB = zeros(numB,3*d);
for idx = 1:d
helpA(:,3*idx-2:3*idx) = [ones(numA,1), -2*A(:,idx), A(:,idx).^2 ];
helpB(:,3*idx-2:3*idx) = [B(:,idx).^2 , B(:,idx), ones(numB,1)];
end
distMat = helpA * helpB';
toc;
% compare to pdist2:
tic;
pdist2(A,B).^2;
toc;
% compare to [1]:
tic;
bsxfun(@plus,dot(A,A,2),dot(B,B,2)')-2*(A*B');
toc;
% Another method: added 07/2014
% compare to ndgrid method (cf. Dan's comment)
tic;
[idxA,idxB] = ndgrid(1:numA,1:numB);
distMat = zeros(numA,numB);
distMat(:) = sum((A(idxA,:) - B(idxB,:)).^2,2);
toc;
结果:
Elapsed time is 1.796201 seconds.
Elapsed time is 5.653246 seconds.
Elapsed time is 3.551636 seconds.
Elapsed time is 22.461185 seconds.
对于更详细的评估w.r.t.数据点的维数和数量遵循下面的讨论(@comments).事实证明,在不同的设置中应该优先选择不同的algos.在非时间紧迫的情况下,只需使用pdist2版本.
进一步的发展:
人们可以考虑用相同原理的任何其他度量来代替平方的欧几里德:
help = zeros(numA,numB,d);
for idx = 1:d
help(:,:,idx) = [ones(numA,1), A(:,idx) ] * ...
[B(:,idx)' ; -ones(1,numB)];
end
distMat = sum(ANYFUNCTION(help),3);
然而,这是相当耗时的.用二维矩阵代替较小的d维的三维矩阵可能是有用的.特别是对于d = 1,它提供了一种通过简单矩阵乘法计算成对差的方法:
pairDiffs = [ones(numA,1), A ] * [B'; -ones(1,numB)];
你有什么进一步的想法吗?
matlab的点平方,性能 – 有效地计算Matlab中的成对平方欧几里德距离相关推荐
- R语言计算曼哈顿距离(Manhattan Distance)实战:计算两个向量的曼哈顿距离、dist函数计算矩阵中两两元素的曼哈顿距离
R语言计算曼哈顿距离(Manhattan Distance)实战:计算两个向量的曼哈顿距离.dist函数计算矩阵中两两元素的曼哈顿距离 目录 R语言计算曼哈顿距离(Manhattan Distance ...
- 计算相似度评价值体系:欧几里德距离和皮尔逊相关度
本文参考学习集体智慧编程内容记录. 欧几里德距离评价: 计算相似度评价值的一个非常简单的方式是使用欧几里德距离评价方法.它以经过人们一直评价的物品为坐标轴,然后将参与评价的人绘制到图上,并考察它们彼此 ...
- python查询缺失值所在位置使用scipy_python – 使用缺失值计算scipy中的成对距离
我对 scipy.spatial.distance.pdist处理缺失(nan)值的方式感到有点困惑. 所以,万一我弄乱了矩阵的维度,让我们把它弄清楚.来自文档: The points are arr ...
- python计算2的平方代码_python – NumPy计算向量的范数2的平方
老实说,可能没有比np.inner或np.dot更快的速度.如果你发现中间变量很烦人,你总是可以创建一个lambda函数: sqeuclidean = lambda x: np.inner(x, x) ...
- matlab三相短路电流计算程序_电力系统短路电流计算 matlab程序
% 电力系统极坐标下的牛顿 - 拉夫逊法潮流计算 disp(' 电力系统极坐标下的牛顿 - 拉夫逊法潮流计算 :'); clear n=input(' 请输入结点数: n='); n1=input(' ...
- python输入两个坐标求距离_计算python中*多组*地理坐标之间的距离
编辑: here's a simple notebook example 一般方法,假设您有一个包含点的DataFrame列,并且您想要计算所有这些列之间的距离(例如,如果您有单独的列,则首先将它们组 ...
- 三维层次聚类分析matlab,聚类分析(三) 层次聚类及matlab程序
一.层次聚类介绍 1.1 简介 层次聚类,主要是对给定的待聚类的数据集进行层次化分解.主要分为两大类: 1.从下到上的凝聚聚类 2.从上到下的分裂聚类 其他算法大部分是对样本之间距离度量或者类间凝聚/ ...
- 皮尔逊积矩相关系数和显著性matlab,Excel 应用RSQ函数计算Pearson乘积矩相关系数的平方...
RSQ函数用于根据known_y's和known_x's中数据点计算得出的Pearson乘积矩相关系数的平方.R平方值可以解释为y方差与x方差的比例.RSQ函数的语法如下. RSQ(known_y's ...
- matlab中if语句多个_科学计算 | MATLAB程序设计基础
点击"蓝字"关注我们 科学计算 | MATLAB程序设计基础 引言 在前面的学习中,我们都是在命令行窗口逐条输入命令,然后由matlab解释执行,这种交互式的命令执行方式,操作简单 ...
最新文章
- c语言程序能够在不同的操作系统下运行,这说明c语言具有很好的,程序设计(C)作业一(有答案)...
- 网站文章要求图文并茂,图片要怎样做好优化工作呢?
- 自组织神经网络的实现
- html绑定按键图片移动,如何使用JS实现用键盘控制图片移动呢?
- 2020蓝桥杯省赛---java---B---4( 合并检测)
- 计算机内部程序代码,计算机为什么能够读懂程序代码?
- 初创企业融资应量力而行
- PAT乙级 1031 查验身份证 (15 分)
- 电大计算机网络模拟题及答案,最新国家开放大学电大本科《计算机网络》期末题库及答案...
- DV、OV、EV :SSL证书那么多,我该选择哪一种?
- 沟通的重要工具——乔哈里视窗
- Windows新版算号器技术原理
- 轻松办公信息化,六大OA产品优劣点评
- Struts1 页面提交到ActionForm,form为null
- 【IEEE】IEEE论文接收后proof(校样)全流程实例讲解
- 链表 java 实现
- 哈迪-温伯格平衡(Hardy-Weinberg equilibrium)法则
- 华为交换路由命令学习笔记
- 欧姆龙CP系列PLC以太网通讯连接SCADA介绍
- linux修改文件夹的访问权限,linux setfacl chmod g+s 修改文件夹和文件的默认访问权限和所属组...
热门文章
- 计算机过滤器的作用,14种功能强大的Wireshark过滤器介绍
- c语言堆栈基本代码入栈出栈_C/C++语言栈的出栈入栈操作实现(完整代码)
- java aop注解日志记录_spring aop通过注解实现日志记录
- java 调用sqlite_java 调用 sqlite 数据库
- php正则表达式 n,CFC4N小试php正则表达式
- python 按钮控件_python实现360皮肤按钮控件示例
- 公平锁非公平锁的实际使用_理解ReentrantLock的公平锁和非公平锁
- python表单防重复提交_关于PHP使用token防止表单重复提交的方法
- 网站“设为首页”代码,“加入收藏”代码
- window git安装 以及 tortoiseGit安装与使用