MATLAB: эффективный способ запуска векторной входной функции с массивом входных данных
У меня есть функция HermitePCECoefficients, которая принимает в качестве входных данных несколько параметров, включая вектор столбца y, и выводит вектор столбца Coefficients, такой же длины, как y:
Coefficients=HermitePCECoefficients(grid,weights,indices,y,mu,sigma,normalized)
Теперь предположим, что y - это не вектор столбцов, а двумерный массив (матрица), и я хочу запустить HermitePCECoefficients на каждом из его столбцов, сохраняя соответствующие выходные данные в массиве. Делать это с помощью цикла for просто и понятно, но это занимает целую вечность:
Coefficients=zeros(size(y));
for i=1:size(y,2)
Coefficients(:,i)=HermitePCECoefficients(grid,weights,indices,y(:,i),mu,sigma,normalized);
end
Таким образом, я поставил bsxfun на работу. Так как bsxfun только работая с двоичными функциями, я создал "фиктивную" двоичную функцию f, которая на самом деле является только функцией одного аргумента:
f=@(a,b) HermitePCECoefficients(grid,weights,indices,a,mu,sigma,normalized);
Затем используется bsxfun таким образом:
Coefficients=bsxfun(f,y,omega_f);
Это прекрасно работает, и это намного быстрее, чем цикл for (Не беспокойтесь о omega_f, это просто вектор, длина которого соответствует количеству столбцов в y).
bsxfun в данном контексте?
Вопрос 2: возможно, лучшее решение было бы непосредственно модифицировать HermitePCECoefficients, чтобы он мог принять универсальный массив y в качестве входных данных. Внутри функции это единственная строка, которая требует, чтобы y был вектор столбца:
Coefficients(i)=dot(weights,y.*Psi)/norm;
weights и Psi - это два вектора столбцов, поэтому, если я передаю массив y, MATLAB жалуется. Есть предложения, как его изменить? Спасибо,
Серджио
2 ответа:
Вариант 2 кажется лучше (но только тестирование покажет). Просто замените
dot(weights,y.*Psi)/normBy
sum(bsxfun(@times, weights.*Psi, y)/norm)Или (вероятно, быстрее)
Любое из вышеперечисленных действий эквивалентно вычислению вектора(weights.*Psi).'*y / norm[ dot(weights,y(:,1).*Psi)/norm, dot(weights,y(:,2).*Psi)/norm, ... ]для произвольного числа столбцовy. Каждая запись этого вектора является результатом для столбцаy.