3D матрица, умножение на последние измерения - PullRequest
1 голос
/ 08 апреля 2020

У меня есть 3D-матрица A, с размером, скажем, 3x12x100. Первые два измерения определяют 3×12 matrices, последнее - просто линейный индекс. Я хочу очень простую операцию над этими 100 матрицами. Для всех этих матриц я хочу, чтобы они умножались на сопряженную транспонирование. С очень простым для l oop я могу создать это:

data = data;
A = zeros(100, 12, 12);
for i=1:100
    A(i, :, :) = data(:, :, i)'*data(:, :, i);
end

Но мне нравится чистый код, так что я действительно не предпочитаю это для -l oop. Я провел некоторый поиск и иногда нахожу что-то вроде mtimesx (это пользовательская функция MATLAB с 2010 года). Я думаю, что мне не хватает чего-то очень очевидного (как обычно), потому что это кажется довольно простой операцией (это просто «поэлементное» матричное умножение).

Ответы [ 2 ]

2 голосов
/ 08 апреля 2020

Размер моей фактической матрицы 3x12x862400. Мой оригинальный сценарий занимает около 10 минут или дольше, вариант того, что @FangQ посты исправляет это в считанные секунды. Мой новый код выглядит следующим образом, обратите внимание, что он все еще находится в стадии разработки, и мне все еще нужно проверить его:

data = rand(3, 12, 862400) + i*rand(3, 12, 862400)
data2 = conj(permute(data, [2 1 3])); % conjugate transpose each matrix
% my data matrix contains 862400 3x12 matrices with complex numbers

Ap = permute(data2, [2 1 4 3]);
Bp = permute(data, [1 4 2 3]);
M = Ap.*Bp;
M = sum(M, 1);
M = permute(M, [2 3 4 1]);
1 голос
/ 08 апреля 2020

@ Крис был прав, вы можете найти пример из этого поста MatlabCentral

https://www.mathworks.com/matlabcentral/answers/10161-3d-matrix-multiplication#answer_413531

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...