我有很多点,我想建立距离矩阵,即每个点与所有其他点的距离,但我不想使用循环,因为花太多时间...是一个更好的方法来构建这个矩阵?这是我的循环:对于一个大小为10000x3的setl,这种方法需要花费我很多时间:(
for i=1:size(setl,1)
for j=1:size(setl,1)
dist = sqrt((xl(i)-xl(j))^2+(yl(i)-yl(j))^2+...
(zl(i)-zl(j))^2);
distanceMatrix(i,j) = dist;
end
end
Run Code Online (Sandbox Code Playgroud) 我很久以前就开始学习Julia了,我决定在Julia和Matlab之间进行一个简单的比较,用一个简单的代码来计算一组高维点的欧几里德距离矩阵.
任务很简单,可分为两种情况:
情况1:给定nxd矩阵形式的两个数据集,比如X1和X2,计算X1中每个点与X2中所有点之间的成对欧几里德距离.如果X1的大小为n1×d,并且X2的大小为n2×d,则得到的欧几里德距离矩阵D的大小为n1×n2.在一般设置中,矩阵D不对称,并且对角元素不等于零.
情况2:给定nxd矩阵X形式的一个数据集,计算X中所有n个点之间的成对欧几里德距离.得到的欧几里德距离矩阵D的大小为nxn,对称,主对角线上的元素为零.
我在Matlab和Julia中实现这些函数的方法如下.请注意,没有一个实现依赖于任何类型的循环,而是简单的线性代数运算.另请注意,使用这两种语言的实现非常相似.
在为这些实现运行任何测试之前,我的期望是Julia代码将比Matlab代码快得多,并且显着提高.令我惊讶的是,事实并非如此!
我的实验参数在下面给出了代码.我的机器是MacBook Pro.(15"2015年中),2.8 GHz Intel Core i7(四核)和16 GB 1600 MHz DDR3.
Matlab版本:R2018a
Julia版本:0.6.3
BLAS:libopenblas(USE64BITINT DYNAMIC_ARCH NO_AFFINITY Haswell)
LAPACK:libopenblas64_
LIBM:libopenlibm
LLVM:libLLVM-3.9.1(ORCJIT,haswell)
结果列于下表(1)中.
表1:计算两个不同数据集(第1列)之间以及一个数据集(第2列)中所有成对点之间的欧几里德距离矩阵的30次试验的平均时间(以标准偏差计).
Two Datasets || One Dataset
Run Code Online (Sandbox Code Playgroud)
Matlab:2.68(0.12)秒.1.88(0.04)秒
朱莉娅V1:5.38(0.17)秒.4.74(0.05)秒
Julia V2:5.2(0.1)秒.
我没想到两种语言之间存在这种显着差异.我希望Julia比Matlab更快,或者至少和Matlab一样快.令人惊讶的是,在这项特定任务中,Matlab的速度几乎是Julia的2.5倍.我不想基于这些结果得出任何早期结论,原因很少.
首先,虽然我认为我的Matlab实现尽可能好,但我想知道我的Julia实现是否是这项任务的最佳实现.我还在学习Julia,我希望有一个更高效的Julia代码可以为这个任务带来更快的计算时间.特别是,朱莉娅在这项任务中的主要瓶颈在哪里?或者,为什么Matlab在这种情况下有优势?
其次,我目前的Julia软件包基于MacOS的通用和标准BLAS和LAPACK软件包.我想知道基于英特尔MKL的基于BLAS和LAPACK的JuliaPro是否会比我正在使用的当前版本更快.这就是为什么我选择从StackOverflow上更多知识渊博的人那里获得一些反馈的原因.
的第三原因是,我想知道为朱编译时间是否包括在示于表1(第二和第三行)的定时,以及是否有更好的方法来评估的功能的执行时间.
我将很感激对前三个问题的任何反馈.
谢谢!
提示:此问题已被识别为StackOverflow上另一个问题的可能重复.但是,这并非完全正确.这个问题有三个方面,如下面的答案所反映.首先,是的,问题的一部分与OpenBLAS与MKL的比较有关.其次,事实证明,如其中一个答案所示,也可以改进实施.最后,使用BenchmarkTools.jl可以改进julia代码本身的基准标记.
MATLAB
num_trials = 30;
dim = 1000;
n1 = 10000;
n2 = 10000;
T = zeros(num_trials,1);
XX1 = randn(n1,dim);
XX2 = rand(n2,dim);
%%% DIFEERENT MATRICES
DD2ds = zeros(n1,n2);
for (i …Run Code Online (Sandbox Code Playgroud) 我有一个矩阵A,包含一年中每一天的24个值(每小时一个值).每列A是不同的一天,每天有24行的数据(A24乘365).我想通过比较每天的小时数据来比较每一天.为此,我将获取一列数据并将其与下一列进行比较.我取两列中每小时数据的差异,然后将它们平方并求它们得到一个值,表明两天的相似程度.然后我用每个可能的天数组合做这个,创建一个365乘365的矩阵d,表明每天与每一天的相似程度.例如,元素d(20,100)包含一个值,表示一年中第20天与第100天的相似程度.代码正在运行,但速度很慢,我希望能够对其进行矢量化.非常感谢帮助.
for j=1:365
for k=1:365
d(j,k)=sqrt(sum((A(:,j)-A(:,k)).^2));
end
end
Run Code Online (Sandbox Code Playgroud)