2016-10-29 3 views
1

Я определил функцию F инлайн, который принимает в качестве аргумента (1,3) Вектор- мудрая применение инлайн функции

a = [3;0.5;1]; 
b = 3 ; 
f = @(x) x*a+b ; 

Предположим, что у меня есть матрицу X размера (N,3). Если я хочу, чтобы применить е к каждой строке X, я могу просто написать:

f(X) 

Я проверил, что F (X) является (N, 1) вектор такой, что f(X)(i) = f(X(i,:)).

Теперь, если я добавить квадратичный член:

f = @(x) x*A*x' + x*a + b ; 

команда F (X) выдает ошибку:

Error using + 
Matrix dimensions must agree. 

Error in @(x) x*A*x' + x*a + b 

Я думаю, Matlab рассматривает всю матрицу X в качестве входных к f. Поэтому он не создает вектор с каждой строкой, i, будучи равно f (X (i, :)). Как мне это сделать ?

я узнал, что существует встроенная функция rowfun, которые могли бы помочь мне, но это, кажется, будет доступна только в версии R2016 (у меня есть версия r2015a)

+0

Вы попробовали 'bsxfun'? – brainkz

+0

Из того, что я понял из документации, bsxfunc будет вычислять квадратичную форму для каждого элемента (не каждой строки) X с A – dada

ответ

1

Это правильно, и ожидалось.

MATLAB пытается остаться близко к математической нотации, и то, что вы делаете (X*A*X' для A 3 × 3 и X N × 3) справедливо по математике, но не совсем то, что вы собираетесь делать - вы в конечном итоге с матрицей N × N, которую вы не можете добавить к матрице N × 1 x*a.

Обходной проста, но некрасиво:

f_vect = @(x) sum((x*A).*x, 2) + x*a + b; 

Теперь, если ваш N не огромна, и вы должны сделать это в миллиарды раз каждую минуту каждого дня, производительность этого больше чем приемлемо.

Iff однако это действительно и действительно является узким местом вашей программы, чем я предлагаю взглянуть на MMX на Файлообменник. Вместе с permute() это позволит вам использовать эти быстрые операции BLAS/MKL для выполнения этого расчета, ускоряя его с надписью.

Обратите внимание, что bsxfun не будет работать здесь, потому что это не поддерживает mtimes() (умножение матрицы).

Вы также можете перейти на MATLAB R2016b, который будет иметь встроенное неявное расширение размеров, предположительно также для mtimes(), но лучше проверить, не уверен в этом.

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