Matlab计算矩阵间距离

  夜深人静时分,宿舍就我自己,只有蚊子陪伴着我,我慢慢码下这段文字............

  感觉知识结构不完善:上学期看论文,发现类间离散度矩阵和类内离散度矩阵,然后百度,找不到,现在学模式识别,见了,发现是数学公司,不过老师不讲........

一.问题来源

  今天有个意想不到的收货,下午讲课的时候遇到一个人主动加我,来自南京信息工程大学的某X(处于隐私保护,未经李某X同意,笔者不敢公开其信息),下面是他的话:很久没去博客园了。。。。现在只有matlab版本的一些hash算法;我现在主要就是在研究基于hash的图像检索,如果你有需要的话,可以给你一些资料。

  我们俩交流了很多.......从实验室,到研究课题,到LOL,笔者深深为他渊博的学识和不俗的谈吐所打动,恩恩,遇到志同道合的人挺不容易的........最重要的是感谢他的开源精神,给我了很多我急需的资料和代码。在此,也感谢博客园提供的这个平台,让我们在这茫茫人海中有了相知相识的机会,哈哈,这其实就是局部敏感哈希的思想——在茫茫人海中发现相似的你啊,爱你们.............

  该篇博客来自于某X分享的代码,我产生了写此篇博文的灵感。

二.问题解析

  实现矩阵间任意行之间的欧式距离。通俗地说如下:两个点的距离知道吧,矩阵是类似的原理,求X1和X2矩阵的距离,假设得到的结果矩阵为C,那么C的下标ij表示的是X1中的第i行和X2中的第j行的距离。

2.1 方法1

if nargin == 2
    P1 = double(P1);
    P2 = double(P2);

    X1=repmat(sum(P1.^2,2),[1 size(P2,1)]);%sum(x,2):横向相加,得到列向量;sum(x),默认为竖向相加。
    X2=repmat(sum(P2.^2,2),[1 size(P1,1)]);
    R=P1*P2';
    D=real(sqrt(X1+X2'-2*R));
else
    P1 = double(P1);

    % each vector is one row
    X1=repmat(sum(P1.^2,2),[1 size(P1,1)]);
    R=P1*P1';
    D=X1+X1'-2*R;
    D = real(sqrt(D));
end

  加入p1:100*256,p2:5900*256,那么x1:100*5900,x25900*100,R:5900*100。

  repmat表示复制和平铺,sum(P1.^2,2)就是每个元素先平方,然后每行求和,就变成一个列向量;求矩阵X1和X2的距离:类似于(A-B)^2 = A^2+B^2-2AB然后开根号;matlab里面调用repmat(a,m,n)命令:三个参数的含义:a:要被复制的矩阵或者向量,m复制成多少行,n复制成多少列。就是把a复制成m行,n列。[1 size(P2,1)]:这个就是将sum(P1.^2,2)得到的列向量复制一行,size(p2,1)列。

  不计算距离如何知道样本是不是紧邻呀,这个就是欧式距离度量紧邻与否。紧邻与否可以通过语意度量,也可以通过距离度量,欧式距就是其中一种。

2.2 方法2

  写到上面,我想起了王老师写的k-means(链接),那时候第一次接触repmat函数。

%repmat 即 Replicate Matrix ,复制和平铺矩阵,是 MATLAB 里面的一个函数。
%B = repmat(A,m,n)将矩阵 A 复制 m×n 块,即把 A 作为 B 的元素,B 由 m×n 个 A 平铺而成。B 的维数是 [size(A,1)*m, size(A,2)*n] 。
%点乘方a.^b,矩阵a中每个元素按b中对应元素乘方或者b是常数
%sum(x,2)表示矩阵x的横向相加,求每行的和,结果是列向量。 而缺省的sum(x)就是竖向相加,求每列的和,结果是行向量。
 dist = sum((repmat(x(i,:),k,1)-nc).^2,2);

2.3 方法3

  直接饮用小伙伴们的问题。

  比如说,A阵是20*10,B阵是30*10的,A阵的20个行向量和B阵中的30个行向量计算欧式距,得到20*30的欧式距离矩阵C这个应该怎么写?
  我每次写出来的C阵每行都是相同的 简直郁闷死了,请教大牛~

clear all
%你可以定义自己的A,B矩阵,下面的矩阵仅作为例子
A=zeros(20,10);
B=ones(30,10);
%Dist距离矩阵
Dist=zeros(20,30);
for i=1:20
    for j=1:30
        Dist(i,j)=norm(A(i,:)-B(j,:));
    end
end

2.4 方法4

Dist = sqrt(A.^2*ones(size(B'))+ones(size(A))*(B').^2-2*A*B')

  这个和方法1,异曲同工。而且,据传,此方法较快。

2.5 方法五

 

for i = 1:size(X,1)
    Distance(i,:) = diag((repmat(X(i,:),n,1)-X)*(repmat(X(i,:),n,1)-X)');
end

 

三.结束语

  看了这么久的LSH,苦于没有合适的代码,很痛苦,给国内的某些大牛写信,从来没收到过回信,给国外的大牛写信基本当天就会回信..........这算是国内外学者的精神风貌不同吧........正式这个原因,我慢慢想着摒弃开源,恩恩,感谢某X,让我有了继续开源的精神动力,人生路上就是需要这类人的陪伴.....从长远来源,笔者认为开源更有意义,也更能体现自己的价值.......每次我说我不懂,别人说我谦虚,其实我是真的不懂.....知道个大概,对面其实是一种误导.......不过有时候也挺佩服自己能坚持下来...........笔者的目标是——互联网行业布道者,欢迎志同道合的人和我联系............晚安~~~

  参考文献:IloveMatlab社区,百度知道,某X语录。

时间: 2024-10-09 03:56:44

Matlab计算矩阵间距离的相关文章

Matlab计算矩阵和函数梯度

一.差分与微分 我自己的理解. 二.求解 2.1 矩阵 这就是matlab的计算结果.太小的话放大些: c = 4 5 9 7 2 1 5 2 6 >> [x,y]=gradient(c) x = 1.0000 2.5000 4.0000 -5.0000 -3.0000 -1.0000 -3.0000 0.5000 4.0000 y = 3.0000 -3.0000 -8.0000 0.5000 -1.5000 -1.5000 -2.0000 0 5.0000 先看x,x就是矩阵的横向梯度,怎

【原创】开源Math.NET基础数学类库使用(17)C#计算矩阵条件数

               本博客所有文章分类的总目录:[总目录]本博客博文总目录-实时更新  开源Math.NET基础数学类库使用总目录:[目录]开源Math.NET基础数学类库使用总目录 上个月对Math.NET的基本使用进行了介绍,主要内容有矩阵,向量的相关操作,解析数据格式,数值积分,数据统计,相关函数,求解线性方程组以及随机数发生器的相关内容.这个月接着深入发掘Math.NET的各种功能,并对源代码进行分析,使得大家可以尽可能的使用Math.NET在.NET平台下轻易的开发数学计算相

用matlab计算桁架内力影响线程序

问题描述 用matlab计算桁架内力影响线程序 用C实现较为困难,想试着用matlab解决问题,有没有谁有相关经验 解决方案 我用过matlab ,我是参加数学建模时用过,我感觉C实现困难,matlab比C更困难,matlab主要是关于数据可视化.数据分析以及数值计算的高级技术计算语言,你到网上看看视频和语句,我感觉会很难实现. 解决方案二: http://wenku.baidu.com/link?url=RjaWUpJvq0OBQ94RDt31koGiRf6geG1YleH-J09ZWCQXp

《MATLAB/Simulink系统仿真超级学习手册》——2.3 MATLAB下矩阵的运算

2.3 MATLAB下矩阵的运算 MATLAB/Simulink系统仿真超级学习手册 矩阵运算是MATLAB最重要的运算,因为MATLAB的运算大部分都建立在矩阵运算的基础之上.MATLAB有三种矩阵运算类型:矩阵的代数运算.矩阵的关系运算和矩阵的逻辑运算.其中,矩阵的代数运算应用最广泛. 根据不同的应用目的,矩阵的代数运算又包含两种重要的运算形式:按矩阵整体进行运算,按矩阵单个元素进行运算的元素群运算. 2.3.1 矩阵的代数运算 1.矩阵的算术运算 矩阵算术运算的书写格式与普通算术运算相同,

java-Java计算现在时刻距离今天0时的时间差

问题描述 Java计算现在时刻距离今天0时的时间差 在Java中获取一个当前时间毫秒值,比如现在1416725832762-->2014-11-23 14:57:12,实际时间距离北京时间今天0点已经过去将近15个小时,如果直接将这个数对86400000(24个小时的毫秒值)取余,得到的余数换算出来大概只有7个小时,我知道原因是这个时间是标准时间,正好于北京时间有8个小时的时差. 这个问题要如何解决呢?我现在用的方法是直接加上8个小时对应的毫秒值再取余,不知道有没有更好的方法呢? 解决方案 时间

开源Math.NET基础数学类库使用(15)C#计算矩阵行列式

原文:[原创]开源Math.NET基础数学类库使用(15)C#计算矩阵行列式                本博客所有文章分类的总目录:http://www.cnblogs.com/asxinyu/p/4288836.html 开源Math.NET基础数学类库使用总目录:http://www.cnblogs.com/asxinyu/p/4329737.html  上个月对Math.NET的基本使用进行了介绍,主要内容有矩阵,向量的相关操作,解析数据格式,数值积分,数据统计,相关函数,求解线性方程

【原创】开源Math.NET基础数学类库使用(15)C#计算矩阵行列式

               本博客所有文章分类的总目录:[总目录]本博客博文总目录-实时更新  开源Math.NET基础数学类库使用总目录:[目录]开源Math.NET基础数学类库使用总目录 上个月对Math.NET的基本使用进行了介绍,主要内容有矩阵,向量的相关操作,解析数据格式,数值积分,数据统计,相关函数,求解线性方程组以及随机数发生器的相关内容.这个月接着深入发掘Math.NET的各种功能,并对源代码进行分析,使得大家可以尽可能的使用Math.NET在.NET平台下轻易的开发数学计算相

【原创】开源Math.NET基础数学类库使用(16)C#计算矩阵秩

               本博客所有文章分类的总目录:[总目录]本博客博文总目录-实时更新  开源Math.NET基础数学类库使用总目录:[目录]开源Math.NET基础数学类库使用总目录 上个月对Math.NET的基本使用进行了介绍,主要内容有矩阵,向量的相关操作,解析数据格式,数值积分,数据统计,相关函数,求解线性方程组以及随机数发生器的相关内容.这个月接着深入发掘Math.NET的各种功能,并对源代码进行分析,使得大家可以尽可能的使用Math.NET在.NET平台下轻易的开发数学计算相

图像处理-如何用MATLAB计算图像标准差,清晰度和全局对比度

问题描述 如何用MATLAB计算图像标准差,清晰度和全局对比度 如何用MATLAB计算图像标准差,清晰度和全局对比度,求程序 解决方案 http://download.csdn.net/detail/yezhengfei007/3220675