夜深人靜時分,宿舍就我本身,只有蚊子陪伴着我,我慢慢碼下這段文字............html
感受知識結構不完善:上學期看論文,發現類間離散度矩陣和類內離散度矩陣,而後百度,找不到,如今學模式識別,見了,發現是數學公司,不過老師不講........算法
今天有個意想不到的收貨,下午講課的時候遇到一我的主動加我,來自南京信息工程大學的某X(處於隱私保護,未經李某X贊成,筆者不敢公開其信息),下面是他的話:好久沒去博客園了。。。。如今只有matlab版本的一些hash算法;我如今主要就是在研究基於hash的圖像檢索,若是你有須要的話,能夠給你一些資料。函數
咱們倆交流了不少.......從實驗室,到研究課題,到LOL,筆者深深爲他淵博的學識和不俗的談吐所打動,恩恩,遇到志同道合的人挺不容易的........最重要的是感謝他的開源精神,給我了不少我急需的資料和代碼。在此,也感謝博客園提供的這個平臺,讓咱們在這茫茫人海中有了相知相識的機會,哈哈,這其實就是局部敏感哈希的思想——在茫茫人海中發現類似的你啊,愛大家.............spa
該篇博客來自於某X分享的代碼,我產生了寫此篇博文的靈感。orm
實現矩陣間任意行之間的歐式距離。通俗地說以下:兩個點的距離知道吧,矩陣是相似的原理,求X1和X2矩陣的距離,假設獲得的結果矩陣爲C,那麼C的下標ij表示的是X1中的第i行和X2中的第j行的距離。htm
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。blog
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)列。get
不計算距離如何知道樣本是否是緊鄰呀,這個就是歐式距離度量緊鄰與否。緊鄰與否能夠經過語意度量,也能夠經過距離度量,歐式距就是其中一種。博客
寫到上面,我想起了王老師寫的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);
直接飲用小夥伴們的問題。
好比說,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
Dist = sqrt(A.^2*ones(size(B'))+ones(size(A))*(B').^2-2*A*B')
這個和方法1,殊途同歸。並且,據傳,此方法較快。
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語錄。