2012-10-25 51 views
4

在学习了Java中的基本编程之后,我发现在我当前的算法过程中转换到MatLab中最困难的部分是避免循环。我知道有很多聪明的方法可以在MatLab中对操作进行矢量化处理,但是我的思想被循环思考“困住”,我发现很难直观地看到我如何矢量化代码。一旦我看到如何做到这一点,这对我来说是有道理的,但是我自己并不那么容易看到它。目前,我有寻找在拉格朗日插值使用的重心权重如下代码:避免MatLab代码中的循环(重心权重)

function w = barycentric_weights(x); 
% The function is used to find the weights of the 
% barycentric formula based on a given grid as input. 

n = length(x); 
w = zeros(1,n); 

% Calculating the weights 
for i = 1:n 
    prod = 1; 
    for j = 1:n 
     if i ~= j 
      prod = prod*(x(i) - x(j)); 
     end 
    end 
    w(i) = prod; 
end 
w = 1./w; 

我敢肯定,必须有在MATLAB中做到这一点更聪明的方式,但我想不出它。如果有人有任何提示,我将非常感谢:)。在MatLab中学习所有向量化技巧的唯一方法就是看看它们在诸如上面的各种场景中如何使用。

回答

2

我可以看到矢量化的吸引力,但我经常问自己,一个月后,当我回到代码并且必须破译所有repmat乱码时,它实际上节省了多少时间。我认为你现在的代码是干净清晰的,除非性能真的很重要,否则我不会惹它。但在这里回答你的问题是我的尽最大努力:

function w = barycentric_weights_vectorized(x) 
    n = length(x); 
    w = 1./prod(eye(n) + repmat(x,n,1) - repmat(x',1,n),1); 
end 

希望帮助!

而我假设x这里是一个行向量。

+0

非常感谢!非常感谢您的意见。 Java对我来说更直观,我猜:) – Kristian

3

一个人必须在MATLAB创新,以避免循环:

[X,Y] =meshgrid(x,x) 
Z = X - Y 
w =1./prod(Z+eye(length(x))) 
+0

非常感谢您的输入。我真的很感激:) – Kristian

3

克里斯蒂安,有办法向量化代码很多。你已经得到了两个。 (我同意shakinfree:你应该总是考虑1)以非矢量化的形式运行需要多长时间(所以你可以知道通过矢量化可以节省多少时间); 2)你可能需要多长时间进行矢量化(这样你才能更好地了解它是否值得你花时间; 3)你会多少次称呼它(值得这样做);和3)可读性。正如shakinfree所建议的那样,您不希望一年后再回到您的代码,并且对您实施的内容感到头疼。至少要确保你的评论很好。

但是在元级别,当您决定需要通过向量化来提高运行时性能时,首先从小型(3x1?)数组开始,并确保您准确理解每次迭代发生的情况。然后,花一些时间阅读本文件,并按照相关链接:

http://www.mathworks.com/help/releases/R2012b/symbolic/code-performance.html

它会帮助你决定何时以及如何量化。

快乐MATLABbing!

Brett

+0

非常感谢您的意见,Brett。我很感激!我也必须同意,阅读经过大量矢量化处理的MatLab代码往往令人困惑,难以形象化。在Java上花了三个月之后,我可以阅读很长的代码段并理解每一步,因为编程语言非常清晰直观。我现在已经花了六个月的时间与MatLab合作,并且在他们包含许多矢量化技巧时,我仍然无法阅读其他人编写的代码。有时候我真的希望MatLab能更快地使用循环,所以我可以坚持下去! – Kristian