Векторизованная версия многомерного внешнего продукта (`kron`) - PullRequest
0 голосов
/ 21 февраля 2019

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

На данный момент моя функция делает то, что я хочу (см. Пример вывода и ввода ниже), и это выглядит так.Я хотел бы сделать это быстрее, избегая двух for циклов, которые я сейчас использую.

function [rr]=OuterVec(r)

N = size(r,1);
rr = zeros(N,N,3,3);

for i=1:N
    for j=1:N
        rr(i,j,:,:)=kron(reshape(r(i,j,:),[1,3]),permute(r(i,j,:),[3 2 1]));
    end
end
end

Примеры ввода / вывода

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

OuterVec (u)

ans (:,:, 1,1) =

 1     1
 1     1

ans (:,:, 2,1) =

 2     2
 2     2

ans (:,:, 3,1) =

 3     3
 3     3

ans (:,:, 1,2) =

 2     2
 2     2

ans (:,:, 2,2) =

 4     4
 4     4

ans (:,:, 3,2) =

 6     6
 6     6

ans (:,:, 1,3) =

 3     3
 3     3

ans (:,:, 2,3) =

 6     6
 6     6

ans (:,:, 3,3) =

 9     9
 9     9

1 Ответ

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

Вам нужно только переставить размеры и применить поэлементный продукт с одноэлементным расширением:

rr = bsxfun(@times, r, permute(r, [1 2 4 3]));

Или, в Matlab R2016b и далее,

rr = r .* permute(r, [1 2 4 3]);
...