2016-01-21 3 views
3

я хотел бы создать анонимную функцию, которая делает что-то вроде этого:Создать переменное число членов в анонимной функции, которая выводит вектор

n = 5; 
x = linspace(-4,4,1000); 

f = @(x,a,b,n) a(1)*exp(b(1)^2*x.^2) + a(2)*exp(b(2)^2*x.^2) + ... a(n)*exp(b(n)^2*x.^2); 

я могу сделать это, как таковые, без прохождения явного параметра n:

f1 = @(x,a,b) a(1)*exp(-b(1)^2*x.^2); 
for j = 2:n 
    f1 = @(x,a,b) f1(x,a,b) + a(j)*exp(b(j)^2*x.^2); 
end 

но мне кажется, хорошо, вид Hacky. У кого-то есть лучшее решение для этого? Я хотел бы знать, как кто-то другой будет относиться к этому.

ответ

3

Ваше хакерское решение, безусловно, не самое лучшее, поскольку рекурсивные вызовы функций в MATLAB не очень эффективны, и вы можете быстро запустить максимальную глубину рекурсии (по умолчанию 500).

Вы можете ввести новое измерение, по которому вы можете суммировать свои массивы a и b. Предполагая, что x, a и b являются векторами-строками:

f = @(x,a,b,n) a(1:n)*exp((b(1:n).^2).'*x.^2) 

Это будет использовать первое измерение как суммирующий измерения: (b(1:n).^2).' является вектор-столбец, который производит матрицу при умножении на x (это диадический продукт, чтобы быть точным). Полученную матрицу n * length(x) можно умножить на a(1:n), так как последняя представляет собой матрицу размером [1,n]. Этот векторно-матричный продукт также выполнит суммирование для нас.

Мини-доказательство:

n = 5; 
x = linspace(-4,4,1000); 
a = rand(1,10); 
b = rand(1,10); 

y = 0; 
for k=1:n 
    y = y + a(k)*exp(b(k)^2*x.^2); 
end 

y2 = a(1:n)*exp((b(1:n).^2).'*x.^2); %' 

all(abs(y-y2))<1e-10 

последняя команда возвращает 1, так что два, по существу, идентичны.

+0

спасибо Andras ... спросил аналогичный вопрос на прошлой неделе, пытался лениться о размножении матриц. хороший ответ! – ConfusinglyCuriousTheThird

+1

Даже лучше, чем 'bsxfun'! Но вам действительно нужна эта сумма? –

+1

@ LuisMendo спасибо, конечно, я этого не делал :) Я даже объяснил, как matmul делает это для вас: D Исправлено сейчас :) –

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