我在MATLAB中编程,并且按照建议,我总是尝试使用矢量化.但最终该计划相当缓慢.所以我发现在一个地方使用循环时代码明显更快(例如下面的例子).
我想知道我是否误解了某些内容或做错了什么,因为在这种情况下性能很重要,而且我不想继续猜测矢量化或循环是否会更快.
% data initialization
k = 8;
n = 2^k+1;
h = 1/(n-1);
cw = 0.1;
iter = 10000;
uloc = zeros(n);
fploc = uloc;
uloc(2:end-1,2:end-1) = 1;
vloc = uloc;
ploc = ones(n);
uloc2 = zeros(n);
fploc2 = uloc2;
uloc2(2:end-1,2:end-1) = 1;
vloc2 = uloc2;
ploc2 = ones(n);
%%%%%%%%%%%%%%%%%%%%%%
% vectorized version %
%%%%%%%%%%%%%%%%%%%%%%
tic
for it=1:iter
il=2:4;
jl=2:4;
fploc(il,jl) = h/6*(-uloc(il-1,jl-1) + uloc(il-1,jl)...
-2*uloc(il,jl-1)+2*uloc(il,jl+1)...
-uloc(il+1,jl) + uloc(il+1,jl+1)...
...
-vloc(il-1,jl-1) - 2*vloc(il-1,jl)...
+vloc(il,jl-1) - vloc(il,jl+1)...
+ 2*vloc(il+1,jl) + …
Run Code Online (Sandbox Code Playgroud) 我正在将OpenCV用于计算机视觉应用.我想在GPU上加速一些矩阵运算(矩阵相当大),并且如果可能的话,希望避免直接在CUDA C中进行编码.OpenCV 2.4.1具有许多GPU加速功能.他们的体验表现如何?我最好还是使用另一个库(例如Thrust)吗?
EDIT 示例应用:计算GPU上的平方欧几里德距离矩阵.目前,我在Matlab中使用并行计算工具箱(PCT)进行的GPU加速(和矢量化)实现比使用OpenCV的C++实现快5到10倍.
Matlab实现:
function K = sqEuclideanDist(P_cpu,Q_cpu)
% Vectorized method to compute pairwise squared Euclidean distance on GPU
% Returns K(i,j) = (P(i,:) - Q(j,:))'*(P(i,:) - Q(j,:))
P_gpu = gpuArray(P_cpu);
Q_gpu = gpuArray(Q_cpu);
[nP, d] = size(P_gpu);
[nQ, d] = size(Q_gpu);
pmag = sum(P_gpu .* P_gpu, 2);
qmag = sum(Q_gpu .* Q_gpu, 2);
% note that K is on GPU
K = ones(nP,1)*qmag' + pmag*ones(1,nQ) - 2*P_gpu*Q_gpu';
end
Run Code Online (Sandbox Code Playgroud)
更新这是另一个完成相同的Matlab实现(感谢/sf/answers/544202641/).但它仅在CPU上运行,因为bsxfun
PCT不支持.仍然在寻找C++替代品.
function …
Run Code Online (Sandbox Code Playgroud) sup = x(i, :);
phi(1, i) = {@(z) exp(-g * sum((z - sup(ones([size(z, 1) 1]),:)) .^ 2, 2))};
这是用于逻辑回归的径向基函数(RBF).这是公式:
我需要你的建议,我可以优化这个公式吗?因为它呼叫数百万次,而且需要很多时间......
我有一个theano符号矩阵
x = T.fmatrix('input')
Run Code Online (Sandbox Code Playgroud)
x
稍后会被n
昏暗的矢量d
(火车时间)填充.
我希望theano相当于pdist
(scipy.spatial.distance.pdist
of pdist
),类似于
D = theano.pdist( x )
Run Code Online (Sandbox Code Playgroud)
我怎样才能做到这一点?
调用scipy.spatial.distance.pdist
上x
直接作为不起作用x
在这个阶段只是象征......
更新:我非常希望能够模仿pdist
"紧凑"行为:即,仅计算距离矩阵的n
x n
个条目中的~1/2 .
我为最近邻搜索编写了一个基本的O(n ^ 2)算法.像往常一样,Matlab 2013a的knnsearch(..)方法工作得更快.
有人能告诉我他们在实施中使用了哪种优化方法?
我可以阅读您可能指向我的任何文档或论文.
PS:我理解网站上的文档提到了关于kd树的论文作为参考.但据我所知,当列数小于10时,kd树是默认选项.我的是21.如果我错了,请纠正我.
在我的代码中,我使用theano来计算欧氏距离矩阵(此处的代码):
import theano
import theano.tensor as T
MAT = T.fmatrix('MAT')
squared_euclidean_distances = (MAT ** 2).sum(1).reshape((MAT.shape[0], 1)) + (MAT ** 2).sum(1).reshape((1, MAT.shape[0])) - 2 * MAT.dot(MAT.T)
f_euclidean = theano.function([MAT], T.sqrt(squared_euclidean_distances))
def pdist_euclidean(mat):
return f_euclidean(mat)
Run Code Online (Sandbox Code Playgroud)
但是下面的代码会导致矩阵的某些值NaN
.我已经读过,计算时会发生这种情况,theano.tensor.sqrt()
并建议在这里进行
在sqrt中添加eps(或max(x,EP))
所以我在代码中添加了一个eps:
import theano
import theano.tensor as T
eps = 1e-9
MAT = T.fmatrix('MAT')
squared_euclidean_distances = (MAT ** 2).sum(1).reshape((MAT.shape[0], 1)) + (MAT ** 2).sum(1).reshape((1, MAT.shape[0])) - 2 * MAT.dot(MAT.T)
f_euclidean = theano.function([MAT], T.sqrt(eps+squared_euclidean_distances))
def pdist_euclidean(mat):
return f_euclidean(mat)
Run Code Online (Sandbox Code Playgroud)
而且我在表演前添加它 …