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