0

我有以下代码用于计算高斯函数的线性组合的结果。我真正想做的是以某种方式对其进行矢量化,以便它在 Matlab 中的性能更高。

请注意,y 是列向量(输出),x 是矩阵,其中每一列对应一个数据点,每一行对应一个维度(即 2 行 = 2D),方差是双精度数,高斯是一个矩阵,其中每一列是对应于高斯平均点的向量,权重是每个高斯前面的权重的行向量。请注意,权重的长度比高斯大 1,因为 weights(1) 是 0 阶权重。

function [ y ] = CalcPrediction( gaussians, variance, weights, x )

basisFunctions = size(gaussians, 2);
xvalues = size(x, 2);
if length(weights) ~= basisFunctions + 1
    ME = MException('TRAIN:CALC', 'The number of weights should be equal to the number of basis functions plus one');
    throw(ME);
end


y = weights(1) * ones(xvalues, 1);

for xIdx = 1:xvalues
    for i = 1:basisFunctions
        diff = x(:, xIdx) - gaussians(:, i);
        y(xIdx) = y(xIdx) + weights(i+1) * exp(-(diff')*diff/(2*variance));
    end
end

end

您可以看到,目前我只是遍历 x 向量,然后遍历 2 for 循环中的高斯。我希望这可以改进 - 我看过 meshgrid 但这似乎只适用于向量(而且我有矩阵)

谢谢。

4

1 回答 1

1

尝试这个

diffx = bsxfun(@minus,x,permute(gaussians,[1,3,2])); % binary operation with singleton expansion
diffx2 = squeeze(sum(diffx.^2,1)); % dot product, shape is now [XVALUES,BASISFUNCTIONS]
weight_col = weights(:); % make sure weights is a column vector
y = exp(-diffx2/2/variance)*weight_col(2:end); % a column vector of length XVALUES

注意,我改为diff因为diffxdiff内置的。我不确定这会提高性能,因为分配数组将抵消矢量化的增加。

于 2013-11-06T18:08:12.683 回答