3

Я написал функцию для вычисления интеграла с использованием гауссового квадратурного правила. Мне нужно векторизовать последние 2 строки, не используя цикл. Есть идеи?векторизация Matlab - как векторизовать функцию Гаусса (код) без цикла

function Q = gauss5(f,a,b,n) 
    % Divide the interval into n parts 
    y = linspace(a,b,n); 
    % Create function to use arrayfun 
    % Sum up the result from the arrayfun with function Fun on particular 
    % intervals, the first argument is array y without the last value, and 
    % the second argument is the array y without the first value 
    a = (y(1:end-1)); 
    b = (y(2:end)); 
    % coefficients - some random numbers 
    c = [1 2 3 4 5]; 
    % nodes - random numbers too 
    x = [1 1 1 1 1]; 
    % calculate b-a 
    w = b-a; 
    % sum up the result 
    Q = 0; 
    for i=1:n-1 
    Q = Q + sum((w(i)*c.*feval(f,((w(i)*x)+a(i))))); 
    end 
end 
+0

Есть ли f различные функции? И 'n' всегда меньше длины' a' и 'b'? –

ответ

0

Если f может получить массив в качестве входных данных, вы можете заменить это:

% sum up the result 
Q = 0; 
for i=1:n-1 
    Q = Q + sum((w(i)*c.*feval(f,((w(i)*x)+a(i))))); 
end 

этим:

wxa = bsxfun(@plus,bsxfun(@times,w,x(:)),a); 
Qs = bsxfun(@times,w,c(:)).*feval(f,wxa); 
Q = sum(Qs(:)) 

Или, если у вас есть Matlab 2016b или более поздней версии, только :

Qs = w.*c(:).*feval(f,w.*x(:)+a); 
Q1 = sum(Qs(:)); 

 Смежные вопросы

  • Нет связанных вопросов^_^