避免MatLab代码中的循环(重心权重)

时间:2012-10-25 21:16:17

标签: matlab loops interpolation vectorization

在学习了Java的基本编程之后,我发现在我当前的算法课程中转换到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中所有矢量化技巧的唯一方法是看看它们如何在各种场景中使用,如上所述。

3 个答案:

答案 0 :(得分:3)

必须在matlab中创造性以避免循环:

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

答案 1 :(得分:3)

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

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

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

它将帮助您确定何时以及如何进行矢量化。

快乐的MATLABbing!

布雷特

答案 2 :(得分:2)

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

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是一个行向量。