我想尝试使用直方图交集核的支持向量机分类器,一个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优化这个代码!
最佳答案
使用这种基于D
的bsxfun
方法,可以去掉内核循环来计算vectorized
-
D = squeeze(sum(bsxfun(@min,A,permute(B,[3 2 1])),2))
或者通过这种修改避免
squeeze
-D = sum(bsxfun(@min,permute(A,[1 3 2]),permute(B,[3 1 2])),3)
如果
D
的计算涉及max
而不是min
,只需将@min
替换为@max
。说明:
bsxfun
的工作方式是在单重维度上进行扩展,并执行调用内的@
所列的操作现在,这个扩展基本上就是如何实现向量化的解决方案来代替for循环数组中的singleton dimensions
表示数组中1
的维数。在许多情况下,单重维度还不存在,对于
bsxfun
的矢量化,我们需要创建singleton dimensions
其中一个工具是使用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
对计算并不重要,因为它会打印一些消息。