相关疑难解决方法(0)

在MATLAB中'for'循环与矢量化

我在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)

performance matlab for-loop vectorization

8
推荐指数
2
解决办法
1534
查看次数

OpenCV GPU库对矩阵运算有多好?

我正在将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上运行,因为bsxfunPCT不支持.仍然在寻找C++替代品.

function …
Run Code Online (Sandbox Code Playgroud)

c++ opencv cuda gpu thrust

7
推荐指数
1
解决办法
6072
查看次数

Matlab公式优化:径向基函数

  • z - 双倍矩阵,大小Nx2;
  • x - 双打矩阵,大小Nx2;

sup = x(i, :);

phi(1, i) = {@(z) exp(-g * sum((z - sup(ones([size(z, 1) 1]),:)) .^ 2, 2))};

这是用于逻辑回归的径向基函数(RBF).这是公式:

在此输入图像描述

我需要你的建议,我可以优化这个公式吗?因为它呼叫数百万次,而且需要很多时间......

math optimization matlab euclidean-distance

6
推荐指数
1
解决办法
1273
查看次数

适用于theano张量的pdist

我有一个theano符号矩阵

x = T.fmatrix('input')
Run Code Online (Sandbox Code Playgroud)

x稍后会被n昏暗的矢量d(火车时间)填充.

我希望theano相当于pdist(scipy.spatial.distance.pdistof pdist),类似于

D = theano.pdist( x )
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点?

调用scipy.spatial.distance.pdistx直接作为不起作用x在这个阶段只是象征......

更新:我非常希望能够模仿pdist"紧凑"行为:即,仅计算距离矩阵的nx n个条目中的~1/2 .

python matlab scipy theano

6
推荐指数
1
解决办法
2959
查看次数

有人可以告诉我Matlab使用的kNN搜索算法吗?

我为最近邻搜索编写了一个基本的O(n ^ 2)算法.像往常一样,Matlab 2013a的knnsearch(..)方法工作得更快.

有人能告诉我他们在实施中使用了哪种优化方法?

我可以阅读您可能指向我的任何文档或论文.

PS:我理解网站上的文档提到了关于kd树的论文作为参考.但据我所知,当列数小于10时,kd树是默认选项.我的是21.如果我错了,请纠正我.

matlab machine-learning knn

4
推荐指数
1
解决办法
2200
查看次数

Theano sqrt返回NaN值

在我的代码中,我使用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)

而且我在表演前添加它 …

python theano

3
推荐指数
1
解决办法
1744
查看次数