Многомерные массивы трехмерных объектов: как векторизовать внутренние продукты - PullRequest
0 голосов
/ 21 февраля 2019

В этом вопросе я рассмотрел две пользовательские функции для умножения массивов матриц 3х3 и векторов 3х1, сохранения структуры трехмерного (матричного) внутреннего произведения и превращения всего процесса в вычислительно эффективный имаксимально быстро.

Теперь я обобщил эти функции на многомерные массивы (NxN) из матриц 3x4 и векторов 3x1.Вот функции, которые я написал и которые используют циклы for.

BlockScalar

Эта функция должна умножить элемент ij (скаляр) матрицы (NxN)) nv элементом ij (матрица 3x3) из A (матрица NxNx3x3).Так что это по сути многомерная версия произведения матрицы на скаляр.

function [B] = BlockScalar(nv,A)

    N=size(nv,1);
    B=zeros(N,N,3,3);

    for i=1:N
        for j=1:N 
            B(i,j,:,:)= nv(i,j).*A(i,j,:,:);
        end
    end

end

-------- Пример BlockScalar

Входные данные:

N=2;
A = shiftdim( repmat( eye(3,3), 1, 1, N, N ), 2 );
nv=[1 2; 3 4];

Выход:

BlockScalar (nv, A)

ans (:,:, 1,1) =

 1     2
 3     4

ans (:,:, 2,1) =

 0     0
 0     0

ans (:,:, 3,1) =

 0     0
 0     0

ans (:,:, 1,2) =

 0     0
 0     0

ans (:,:, 2,2) =

 1     2
 3     4

ans (:,:, 3,2) =

 0     0
 0     0

ans (:,:, 1,3) =

 0     0
 0     0

ans (:,:, 2,3) =

 0     0
 0     0

ans (:,:, 3,3) =

 1     2
 3     4

BlockMatrix

Эта вторая функция в настоящий момент не работает, потому что я изо всех сил пытаюсь реализовать матрицупроизведение A*u между ij-м элементом (который представляет собой матрицу 3x3), равным A, и вектором столбца, который содержит 3 компонента ij-го элемента u.Как вы можете легко видеть, я хотел бы, чтобы это было многомерное обобщение матричного * векторного произведения в 3-D.

 function [B] = BlockMatrix(A,u)

    N = size(u,2);
    B = zeros(N,N,3);

  for i=1:N
     for j=1:N
             B(i,j,:)= reshape(reshape(A(i,j,:,:),[3,3])*reshape(u(i,j,:),[1 3]),size(u));
     end

 end

------- Пример BlockMatrix

Если вход представляет собой обобщенную единичную матрицу (элементы NxN, каждый из которых представляет собой единичную матрицу 3x3), а матрица NxN состоит из векторов 3x1:

 N=2;   

 A = 4.*shiftdim( repmat( eye(3,3), 1, 1, N, N ), 2 );

 c = ones(2,2);
 V(1,1,:)=[1 2 3];
 u = c.*V;

Требуемый выходной сигнал явнообъект, имеющий структуру V (матрица NxN, состоящая из векторов 3x1), где каждый из элементов представляет собой матричное произведение reshape(A(i,j,:,:),[3 3]) и reshape(V(i,j,:),[1 3]).То есть:

i=1;j=1;
reshape(B(i,j,:),[3,1])


ans =

 4
 8
 12

для любых i и j.

Полный вывод для полноты:

B (:,:, 1) =

 4     4
 4     4

B (:,:, 2) =

 8     8
 8     8

B (:,:, 3) =

 12     12
 12     12

Вопросы

Я изо всех сил пытаюсь (0) заставить BlockMatrix работать;(1) найти способ правильно векторизовать это, и (2) я даже не уверен, что векторизованная версия будет быстрее.

Буду признателен за любую помощь в ответе на вышеприведенные вопросы.

1 Ответ

0 голосов
/ 22 февраля 2019

Для первой функции:

B = bsxfun(@times, A, nv);

Для второй:

B = sum(bsxfun(@times, A, reshape(u, [size(u,1) size(u,2) 1 size(u,3)])), 4);
...