在Matlab中有没有更快的方法来计算矩阵的元素指数?

在Matlab中有没有更快的方法来计算矩阵的元素指数?,matlab,performance,Matlab,Performance,我正在分析我的代码,这一行似乎是一个瓶颈。其思想是基于相同维度的θ向量创建给定维度的n个观测值的空间相关矩阵,该向量包含要拟合的维度超参数 在我的全部代码中,在计算似然函数以优化θ参数时,这个空间相关函数被调用了数千次(每次迭代)。在整个代码的每次迭代中,观察值的数量增加一个,并且每次迭代都必须重新调整θ参数。因此,您可以看到,随着算法的发展,这一行代码是如何变得至关重要的 我认为最慢的线,即,R=exp(sum(bsxfun(@times,-abs(D_X))^corr_模型,重塑(θ,[1

我正在分析我的代码,这一行似乎是一个瓶颈。其思想是基于相同维度的θ向量创建给定维度的n个观测值的空间相关矩阵,该向量包含要拟合的维度超参数

在我的全部代码中,在计算似然函数以优化θ参数时,这个空间相关函数被调用了数千次(每次迭代)。在整个代码的每次迭代中,观察值的数量增加一个,并且每次迭代都必须重新调整θ参数。因此,您可以看到,随着算法的发展,这一行代码是如何变得至关重要的

我认为最慢的线,即,
R=exp(sum(bsxfun(@times,-abs(D_X))^corr_模型,重塑(θ,[1 D])),3)
在计算最终的n×n矩阵的最终元素指数时花费的时间最多(n×n矩阵是在距离矩阵的3维上求和后生成的)。但这方面有很多工作要做,所以我不确定这是否是整体性能最关键的方面

感谢您的任何见解

我已经用
bsxfun
替换了
repmat
命令,将给定的θ乘以维度距离矩阵
D_X
,这显著加快了代码的速度。但是,嵌套第二个
bsxfun
以执行距离平方,即替换
abs(dux)。^corr\u model
,使代码运行较慢

n = 500;
dimension = 20;
D_X = repmat(rand(n),[1 1 dimension]);
theta = rand(dimension, 1);
corr_model = 2;

R = corr(corr_model,theta, D_X);

function R = corr(corr_model,theta,D_X)
% calculate the correlation matrix for the modified nugget effect model
% corr_model - the correlation model used for the spatial correlation
% corr_model = 2: gaussian correlation function
% theta - vector of hyperparameters
% D_X - the distance matrix for the input locations

d = size(theta,1);

switch corr_model
    case 2 %Gaussian correlation function  
        R = exp(sum(bsxfun(@times, -abs(D_X).^corr_model,reshape(theta,[1 1 d])),3));
end
end

以下是一个更优化的版本:

n = 500;
dimension = 20;
D_X = rand(n);
theta = rand(dimension, 1);
corr_model = 2;

function R = corr(corr_model, theta, D_X)
    switch corr_model
        case 2  
            R = exp(-sum(theta)) .^ ( D_X .^ corr_model );
    end
end
已采取以下步骤:

R = exp(sum(bsxfun(@times, -abs(D_X).^corr_model,reshape(theta,[1 1 d])),3));
R = exp((-abs(D_X) .^ corr_model) .* sum(theta)) ;
R = exp((-D_X .^ corr_model) .* sum(theta)) ;
R = exp((D_X .^ corr_model) .* (-sum(theta)));
R = exp(-sum(theta)) .^ ( D_X .^ corr_model );
  • 您可以设置
    D_X=rand(n)
    而不是
    repmat
    ,这样您就可以算出
    (-abs(D_X)。^corr\u model)
    并将其乘以
    θ的和

  • 由于
    dux
    是实矩阵
    abs(dux)^2
    相当于
    dux^2

  • (-D\u X.^corr\u模型)。*sum(θ)
    转换为
    (D\u X.^corr\u模型)。*(-sum(θ)
    可能会加快计算速度,因为你只对标量求反,而对标量求反应该比对数组求反便宜

  • 知道
    x^(ab)=(x^a)^b
    表达式
    exp((D_x.^corr_模型)。*(-sum(theta))
    可以转换为
    exp(-sum(theta))。^(D_x.^corr_模型)
    。在第一个表达式中,我们对
    dux
    有三个操作,但在第二个表达式中,对
    dux
    应用了两个操作

编辑: 如
D_X
矩阵的注释部分所述,由于不同,因此上述方法不适用,因此您可以使用以下方法:

D_X1 = reshape(permute(D_X, [3 2 1]), dimension,[]);
%calling thousands of times
for k = 1 : 10000
    R = corr(corr_model,theta, D_X1);
end
% matrix reshaped to its original size
Result = reshape(R,n,n);

function R = corr(corr_model, theta, D_X)
    switch corr_model
        case 2  
            R = exp(-theta.' * (D_X.^corr_model));
    end
end
在这里,
D_X
被置换和重塑为一个
[20 X 250000]
矩阵,因此您可以使用矩阵乘法而不是乘积之和。
此外,如果相关矩阵是对称的,则可以使用其元素的一半。现在矩阵大小为
[20 x 125250]

idx = tril(true(n));
D_X1 = reshape(permute(D_X, [3 2 1]), dimension,[]);
D_X1 = D_X1(:,idx);

for k = 1 : 10000
    R = corr(corr_model,theta, D_X1);
end

% matrix reshaped to its original size
Result = zeros(n);
Result(idx) = R;
d = diag(Result);
Result = Result + Result.'
Result(1:n+1:end)=d;

嗨,谢谢你花时间看这个。但我不相信这会起作用,因为我的D_X是一个三维矩阵/张量。我需要做repmat,这样我就可以得到500x500x20的值,因此类似于我的实际距离矩阵/张量。本质上,我有500个样本在20维中,我需要找到每对样本之间的距离-在每个维中。然后我需要将这些维度距离乘以相应的θ参数。因此,我不认为首先计算出θ的和?最好将示例改写为
D_X=rand(n,n,维)
显示您有20个不同的相关矩阵,但您当前的示例显示您只有一个相关矩阵。答案已更新。