matlab関数bsxfun(効率コード)
3749 ワード
bsxfunはmatlabのバージョンR 2007 aから提供される関数であり、「applies an element-by-element binary operation to arrays a and b,with singleton expansion enabled.」
関数機能:2つの配列間要素が1つずつ計算される2値操作
使用方法:C=bsxfun(fun,A,B)
2つの配列AとBの間の要素が1つずつ計算される2値操作.funは関数ハンドルまたはmファイルであり、以下の内蔵関数であってもよい.
@plus加@minus減@times配列に『Simulinkと信号処理』@rdivide左除@ldivide右除@power配列べき乗@max二値最大値@min二値最小値@rem残数@mod求模@atan 2四象限逆切@hypot平方和の平方根@eqは@neに等しくない@ltはwww.iLoveMatlabより小さい.cn@leが@gtより大きいか@geより大きいか@and論理に等しいか@or論理または@xor論理が異なるか
3つの方法の比較:
適用例:
データAとBがあると仮定します.各行はサンプルで、各列は特徴です.ガウスコアを計算するには、k(||x-xc|)=exp{-|x-xc|^2/(2*σ)^2)}xcがコア関数の中心であり、σ関数の幅パラメータとして、関数の半径方向の作用範囲を制御します.もちろん二重forで実現できます(第一直感が三重forなら...).
2000の使用×1000サイズのAとBで、運転時間は88秒です.量子化された次のバージョンを考慮します.
同じデータを使用すると、実行時間は0.85秒で、100倍以上加速します.両者の結果が同じかどうかを判断するには、次のようにします.
bsxfunはmatlabのバージョンR 2007 aから提供される関数であり、「applies an element-by-element binary operation to arrays a and b,with singleton expansion enabled.」
関数機能:2つの配列間要素が1つずつ計算される2値操作
使用方法:C=bsxfun(fun,A,B)
2つの配列AとBの間の要素が1つずつ計算される2値操作.funは関数ハンドルまたはmファイルであり、以下の内蔵関数であってもよい.
@plus加@minus減@times配列に『Simulinkと信号処理』@rdivide左除@ldivide右除@power配列べき乗@max二値最大値@min二値最小値@rem残数@mod求模@atan 2四象限逆切@hypot平方和の平方根@eqは@neに等しくない@ltはwww.iLoveMatlabより小さい.cn@leが@gtより大きいか@geより大きいか@and論理に等しいか@or論理または@xor論理が異なるか
3つの方法の比較:
function test_dist(m, n)
X = rand(m,n);
D = use_bsxfun(X);
D = use_repmat(X);
D = use_for(X);
end
function D=use_bsxfun(X)
v = dot(X,X);
D = bsxfun(@plus,v,v')-2*(X'*X);
end
function D=use_repmat(X)
v = dot(X,X);
D = repmat(v,length(v),1) + repmat(v',1,length(v)) - 2*(X'*X);
end
function D=use_for(X)
D = zeros(size(X,2));
for i=1:size(D,1)
for j=i+1:size(D,2)
D(i,j) = sum((X(:,i)-X(:,j)).^2);
end
end
D = max(D,D');
end
適用例:
データAとBがあると仮定します.各行はサンプルで、各列は特徴です.ガウスコアを計算するには、k(||x-xc|)=exp{-|x-xc|^2/(2*σ)^2)}xcがコア関数の中心であり、σ関数の幅パラメータとして、関数の半径方向の作用範囲を制御します.もちろん二重forで実現できます(第一直感が三重forなら...).
K1 = zeros(size(A,1),size(B,1));
for i = 1 : size(A,1)
for j = 1 : size(B,1)
K1(i,j) = exp(-sum((A(i,:)-B(j,:)).^2)/beta);
end
end
2000の使用×1000サイズのAとBで、運転時間は88秒です.量子化された次のバージョンを考慮します.
sA = (sum(A.^2, 2));
sB = (sum(B.^2, 2));
K2 = exp(bsxfun(@minus,bsxfun(@minus,2*A*B', sA), sB')/beta);
同じデータを使用すると、実行時間は0.85秒で、100倍以上加速します.両者の結果が同じかどうかを判断するには、次のようにします.
assert(all(all(abs(K1-K2)<1e-12)))
C = bsxfun(fun,A,B) appliesthe element-by-element binary operation specified