2013-04-13 11 views
0

У меня есть данные размера выборки m из n x n матриц в n по m*n матрица назовите его P.Как «векторизовать» эту операцию?

У меня также есть функция, позвоните, если f, который работает на фиксированном векторе, назовите его v и n x n матрицами и вернет действительное число.

Я хочу, чтобы создать 1 x m вектор действительных чисел, назовем его d, при работе f на v и каждый из n x n матриц в P.

Так, скажем, к примеру, n = 3 и m = 6 Я хотел бы:

d(1) = f(v,P(:,1:3)), d(2) = f(v,P(:,4:6)), . . ., d(6) = f(v,P(:,16:18)) 

Как я могу сделать это, не делая петлю?

Спасибо!

+1

Если у вас есть данные размера выборки 'm' из' nxn' матриц, то разве это не будет 'm by n * n' matrix? –

+0

Что делает ваша функция? – Justin

+1

@Parag OP говорит, что он имеет m nxn-матрицы, уложенные по размеру, поэтому конечная матрица nx (m * n) – Justin

ответ

1

Не зная, что ваша f функции делать, я могу предложить только псевдо-Векторизованное решение с ARRAYFUN:

d = arrayfun(@(x) f(v,P(:,x:x+2)), n-2:3:n*m); 

Он работать почти с той же скоростью, как простой цикл (который я думаю, имеет четкий код):

d = zeros(1,m); 
for k = 1:m 
    d(k) = f(v,P(:,n*k-2:n*k)); 
end 
+0

Это важная вещь, как вы говорите: «У меня, кажется, более четкий код». Код, который будет работать практически на той же скорости, что и цикл, поэтому зачем создавать кусок кода, который невозможно будет прочитать? Векторизация может время от времени запускать. – 2013-04-13 02:41:54

+0

Я уже использовал решение массива, но эта функция должна быть оценена много раз для разных значений v (она минимизирована относительно v, чтобы быть точным). Поэтому я надеюсь ускорить процесс, имея большой набор данных (m> 75) и высокую размерность (n> 3), для минимизации может потребоваться более часа. Это не должно быть невыполнимой задачей. Ближайший я пришел (с предложением от другого форума): P = изменить (P, n, n, m); a = 1: m; d = f (v, P (:,:, a)), но безуспешно! После того, как я векторизовать, я надеюсь оценить функцию параллельно! –

+0

Если ваше узкое место действительно является одним из циклов, вам может быть лучше, если вы напишете его как функцию MEX. В какой-то момент становится быстрее писать что-то в C, чем векторизовать его в MATLAB – wakjah

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