gpt4 book ai didi

matlab - 仅在非零条目不同结果时评估 arrayfun

转载 作者:行者123 更新时间:2023-12-02 06:50:26 24 4
gpt4 key购买 nike

我有两个向量 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,然后将某些函数应用于每个单独的元素。相反,让我们向量化您的代码

% 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 术语的注释:小心地说这里有一个“稀疏矩阵”,即 special variable type在 MATLAB 中。你有一个标准矩阵,它在数学上是稀疏的!在稀疏矩阵上的操作可能略有不同。

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com