gpt4 book ai didi

performance - MATLAB 中的直方图交集核优化

转载 作者:太空宇宙 更新时间:2023-11-03 20:28:53 24 4
gpt4 key购买 nike

我想尝试使用直方图交集内核的支持向量机分类器,用于包含 153 张图像的数据集,但需要很长时间。这是我的代码:

a = load('...'); %vectors
b = load('...'); %labels
g = dataset(a,b);

error = crossval(g,libsvc([],proxm([],'ih'),100),10,10);
error1 = crossval(g,libsvc([],proxm([],'ih'),10),10,10);
error2 = crossval(g,libsvc([],proxm([],'ih'),1),10,10);

我在 proxm 函数中的内核实现是:

...
case {'dist_histint','ih'}
[m,d]=size(A);
[n,d1]=size(B);
if (d ~= d1)
error('column length of A (%d) != column length of B (%d)\n',d,d1);
end

% With the MATLAB JIT compiler the trivial implementation turns out
% to be the fastest, especially for large matrices.
D = zeros(m,n);
for i=1:m % m is number of samples of A
if (0==mod(i,1000)) fprintf('.'); end
for j=1:n % n is number of samples of B
D(i,j) = sum(min([A(i,:);B(j,:)]));%./max(A(:,i),B(:,j)));
end
end

我需要对此代码进行一些 matlab 优化!

最佳答案

你可以用这个 bsxfun 摆脱内核循环来计算 D基于 vectorized方法-

D = squeeze(sum(bsxfun(@min,A,permute(B,[3 2 1])),2))

或通过此修改避免挤压 -

D = sum(bsxfun(@min,permute(A,[1 3 2]),permute(B,[3 1 2])),3)

如果D的计算涉及max而不是min,只需将@min替换为 @max 那里。


说明: bsxfun 的工作方式是它对单例维度进行扩展,并执行 @< 列出的操作 在它的调用中。现在,这种扩展基本上就是实现替代 for 循环的矢量化解决方案的方式。数组中的单一维度,我们指的是数组中1 的维度。

在许多情况下,单例维度并不存在,为了使用 bsxfun 进行矢量化,我们需要创建单例维度。这样做的工具之一是使用 permute .这基本上就是前面所述的矢量化方法的工作方式。

因此,您的内核代码 -

...
case {'dist_histint','ih'}
[m,d]=size(A);
[n,d1]=size(B);
if (d ~= d1)
error('column length of A (%d) != column length of B (%d)\n',d,d1);
end

% With the MATLAB JIT compiler the trivial implementation turns out
% to be the fastest, especially for large matrices.
D = zeros(m,n);
for i=1:m % m is number of samples of A
if (0==mod(i,1000)) fprintf('.'); end
for j=1:n % n is number of samples of B
D(i,j) = sum(min([A(i,:);B(j,:)]));%./max(A(:,i),B(:,j)));
end
end

减少到-

...
case {'dist_histint','ih'}
[m,d]=size(A);
[n,d1]=size(B);
if (d ~= d1)
error('column length of A (%d) != column length of B (%d)\n',d,d1);
end
D = squeeze(sum(bsxfun(@min,A,permute(B,[3 2 1])),2))
%// OR D = sum(bsxfun(@min,permute(A,[1 3 2]),permute(B,[3 1 2])),3)

我假设行:if (0==mod(i,1000)) fprintf('.'); end 对计算并不重要,因为它会打印某些消息。

关于performance - MATLAB 中的直方图交集核优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29682866/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com