Умножение 3-х мерных матриц в Matlab

У меня есть карта нормалей размером mxnx3, где каждый пиксель имеет вектор нормали {Nx, Ny, Nz}. Я хочу независимо вращать каждый вектор нормали с помощью матрицы вращения. Пусть R будет матрицей вращения размером mxnx3x3, где каждый пиксель имеет матрицу вращения размером 3x3.

Я хочу умножить матрицу вращения в каждом пикселе на вектор нормали, чтобы получить повернутые векторы нормали. Я ищу оптимизированный способ выполнения задачи, так как перебор каждого пикселя может быть не лучшим способом.

Пожалуйста помоги!!


person Harshit Agrawal    schedule 12.05.2013    source источник


Ответы (1)


я бы попробовал

res = sum( bsxfun(@times, map, R), 4 );

С map и m на n на 3 векторов нормалей, и R на m на n на 3 на 3 поворот на вектор.

Если подумать, вам может понадобиться использовать permute

res = sum( bsxfun(@times, map, permute(R, [1 2 4 3]) ), 4 ); % transposing the vectors

Или, как выразился Harshit:

res = sum( permute( bsxfun(@times, map, R ), [1 2 4 3]), 4 ); % transposing the vectors
person Shai    schedule 12.05.2013
comment
Привет, Шай, спасибо за ответ! Поворот, о котором я говорю, представляет собой умножение матриц, поэтому для каждого пикселя я хотел бы найти Rij * Nij, где Rij — матрица поворота пикселя 3x3 (i,j), а Nij — вектор нормали пикселя 3x1 (i ,j), результатом будет повернутый вектор нормали 3x1. Ваше решение делает то же самое? Если да, то объясните, пожалуйста, как это делается. С уважением, - person Harshit Agrawal; 12.05.2013
comment
@HarshitAgrawal, тогда вы можете думать о умножении матрицы на вектор A*x как sum( bsxfun( @times, A, x' ), 2 ) - person Shai; 12.05.2013
comment
Спасибо за решение. Есть небольшая правка. Мы должны переставить его после применения bsxfun. Пожалуйста, смотрите мое редактирование. - person Harshit Agrawal; 13.05.2013