1. 德氏高速算術法
全名是德布爾演算法。
德布爾演算法是數學上的一種高級快速演算法,別名也叫作德氏高速算術法。
數學的子領域數值分析中,德布爾演算法(DeBooralgorithm)是快速而且數值上穩定的演算法,用於計算B樣條形式的樣條曲線。這是用於貝茲曲線的deCasteljau演算法的一個推廣。
2. 求一個用python實現的基於deboor-cox的B樣條演算法
#!/usr/sbin/env python
# -*- coding:utf-8 -*-
import math
# ItemCF演算法
def ItemSimilarity(train):
C = dict()
N = dict()
for u,items in train.items():
for i in items.keys():
N[i] += 1
for j in items.keys():
if i == j:
continue
C[i][j] += 1
W = dict()
for i,related_items in C.items():
for j,cij in related_items.items():
W[i][j] = cij / math.sqrt( N[i] * N[j])
return W
# ItemCF-IUF演算法
def ItemSimilarity_v2(train):
C = dict()
N = dict()
for u,items in train.items():
for i in items.keys():
N[i] += 1
for j in items.keys():
if i == j:
continue
C[i][j] += 1 / math.log(1+len(items)*1.0)
W = dict()
for i,related_items in C.items():
for j,cij in related_items.items():
W[i][j] = cij / math.sqrt( N[i] * N[j])
return W
def Recommend(train,user_id,W,K):
rank = dict()
ru = train[user_id]
for i,pi in ru.items():
for j,wj in sorted(W[i].items,key=itemgetter(1),reverse=True)[0:K]:
if j in ru:
continue
rank[j] += pi*wj
return rank
3. Matlab如何繪制三次B樣條基函數
原文:http://hi..com/junus/item/129037fbad8b1fc4a835a2ca
均勻三次B樣條與非均勻三次B樣條的基函數[Matlab版]
%花了兩天時間才搞明白均勻和非均勻B樣條基函數的區別,並在Matlab下調試通過.
%給大家共享一下,有研究這個的可以省些時間
%************三次均勻B樣條基函數************
function y=Nfun(i,t)
%參數i,
y=0;
for j=0:(3-i)
y=y+(-1)^j*nchoosek(4,j)*(t+3-i-j)^3;
end
y=y/6;
%************K次非均勻B樣條基函數************
function result = Bbase(i,k,u,t)
%第i段k次B樣條基,Deboor遞推遞歸演算法
%t為變數,u(i)<=t
if k==0
if u(i)<=t && t<=t<=u(i+1);
result=1;
return;
else
result=0;
return;
end
end
if u(i+k)-u(i)==0
alpha=0;
else
alpha=(t-u(i))/(u(i+k)-u(i));
end
if u(i+k+1)-u(i+1)==0
beta=0;
else
beta=(u(i+k+1)-t)/(u(i+k+1)-u(i+1));
end
result=alpha*Bbase(i,k-1,u,t)+beta*Bbase(i+1,k-1,u,t);
end
給你個計算樣條基函數的程序自己用plot畫就行
function L=bsp(x,k,knot)
spint=[];
p=length(knot)-k;
q=length(x);
ma=diag(ones(1,p));
for j=1:q
for i=1:p
sp=spmak(knot,ma(i,:));
spint(j,i)=fnval(sp,x(j));
end
end
L=spint;
4. 求;B-樣條曲線的deboor演算法和C++程序
voidCGraph151View::seekPoint(intk)//表示k階2{3CPoint *interim;//存儲B樣數組指針4CDC *pDC =GetDC();5CGraph151Doc *pDoc = GetDocument();//6intj = pDoc->Length-1;7intlength=1.0/0.001;//B樣曲線的點的個數8interim =newCPoint[length];//保存B樣曲線點9intindex_length=0;//記錄interim數組下一個下標10//畫控制點圖11pDC->MoveTo(pDoc->m_point[0]);12for(intn=0;n<pDoc->Length;n++)13{14pDC->LineTo(pDoc->m_point[n]);15pDC->MoveTo(pDoc->m_point[n]);16}17///結束1819for(floatt=pDoc->T[0];t<pDoc->T[pDoc->T_Length-1];t +=0.001)20{21inti;22chushihua();//還原m_point 和 im_point點數組使與初始化相同23for(intr=1;r<k;r++)24{25guodian();//更新一下m_point點數組 的數據26for( i=r;i<=j;i++)27{28floatpara1;29floatpara2;3031if( (pDoc->T[i+k-r] - pDoc->T[i]) !=0.0)32{33para1 = (t - pDoc->T[i]) / (pDoc->T[i+k-r] - pDoc->T[i]);34para2 = (pDoc->T[i+k-r] - t) /(pDoc->T[i+k-r] - pDoc->T[i]);35}36else37{38para1=0.0;39para2=0.0;40}4142intx =int( (para1 * pDoc->m_point[i].x) + (para2 * pDoc->m_point[i-1].x) );43inty =int( (para1 * pDoc->m_point[i].y) + (para2 * pDoc->m_point[i-1].y) );44pDoc->im_point[i].SetPoint(x,y);45}4647}4849interim[index_length++].SetPoint( pDoc->im_point[3].x,pDoc->im_point[3].y);//存儲計算出的點50}5152//畫圖 B樣曲線53CPen pen(PS_SOLID,1,RGB(255,0,0));54pDC->SelectObject(pen);55pDC->MoveTo(interim[0]);56for(intn=0;n<length;n++)57{58pDC->LineTo(interim[n]);59pDC->MoveTo(interim[n]);60}61//B樣曲線畫圖結束62}