给我两个 vector x,y并创建距离矩阵

B=pdist2(x,y);

现在我评估某个函数f(x),
s=5;
if s-x > 0
    y=(1-x/s)^4*(1+4*x/s)/20;
else
    y=0;
end

其中s是一些参数。通过预定义s并使用
A=arrayfun(@f,B);

矩阵A根据需要是正定的。

由于矩阵是稀疏的,所以我只想对将返回非零值的f(x)求值。我的尝试是
B=pdist2(x,y);
B(B>s)=0;
B=B/s;
indexB=find(B);
Atmp=arrayfun(@f,B(indexB));
A(indexB)=Atmp;

但是现在A不是正定的,并且具有比以前更少的非零条目。有人可以解释我在做什么/正在磨损吗?

谢谢大家,我发现了错误。在B的对角线上有一些零项,我必须分别计算。

最佳答案

我想知道为什么您要尝试为B编制索引,然后将某些函数应用于每个单独的元素。相反,让我们 vector 化您的代码

% Same setup
B = pdist2(x,y); s = 5;
B(B >= s) = 0;  B = B/s;
% Don't use arrayfun, instead use vectorised code
% The previous line already dealt with the 'else' case from f(x)
B = ((1-B/s).^4).*(1+4*B/s)/20;

注意,每次我们在两个非标量之间进行操作时,都必须使用按元素操作.^.*。其他除法和乘法都带有标量,但是我们可以放心使用,并养成使用它们的习惯!
B = ((1-B./s).^4).*(1+4.*B./s)./20;

关于MATLAB术语的注释:请谨慎地说,这里有一个“稀疏矩阵”,即MATLAB中的special variable type。您有一个数学上稀疏的标准矩阵!在稀疏矩阵上进行运算可能会略有不同。

关于matlab - 仅在非零条目上评估arrayfun结果不同,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45919650/

10-12 04:43