2013-07-09 6 views
2

У меня есть матрица A с размерами 15NxM. То есть он состоит из N различных матриц размером 15xM, уложенных друг на друга.Умножьте вектор с блочной матрицей в matlab

У меня также есть вектор B с размером 1x15.

Что я хотел бы сделать, это выполнить простое умножение матрицы B * A (Block) на каждый из N блоков в A, чтобы в итоге я получил матрицу NxM.

Мне нужно сделать это без каких-либо циклов, потому что основная причина, по которой я делаю это, - это получить некоторую скорость.

Спасибо.

+1

Посмотрите на этот stackoverflow [вопрос] (http://stackoverflow.com/questions/1745299/multiply-a-3d-matrix-with-a-2d-matrix). – user2482876

ответ

2

Вы можете попробовать

result = reshape(B * reshape(A, 15, []), N, M); 

Это позволяет избежать когда-либо создать промежуточный "repmat" копия B; но reshape может быть медленным.

+0

Спасибо, он жив! :) – BLaursen

0

Вы можете преобразовать матрицу A в массив ячеек. Сначала вы будете хотеть, чтобы создать N-элементный массив вашей размерности матрицы (15) для определения размеров ваших клеток:

dimArray = repmat(15, 1, N); % 1xN array of the number 15 

Следующих вы будете называть mat2cell на вашей матрице A, чтобы преобразовать его в клетку массив, в котором каждая ячейка представляет собой 15xM подматрицы А:

newA = mat2cell(A, dimArray); 

Наконец, вызовите cellfun на массив ячеек, чтобы сделать ваше умножение:

result = cellfun(@(x) B*x, newA, 'UniformOutput', false); 

Который должен дать вам массив ячеек result, содержащий результат B*A(block) для каждого блока в вашей матрице A. Вероятно, вы можете поместить все это в одну строку или не более двух:

result = cellfun(@(x) B*x, mat2cell(A, repmat(15, 1, N)), 'UniformOutput', false); 

Не самый чистый код для чтения. Это похоже на несколько круглый способ сделать это. Если кто-то получит его для работы с repmat или подобным, это может быть лучшим способом.

+0

Поскольку 'B' - это вектор строки, я не думаю, что вам нужно транспонировать в вашем' (x) B. '* X' - Я думаю, что правильная форма начнет «cellfun» (@ (x) B * x'. Когда я это пробовал, мне нужно было установить «uniformoutput» на «false», а затем преобразовать результирующий массив ячеек. Кажется излишне сложным? – Floris

+0

Да, это выглядит немного сложнее. И я, должно быть, неправильно читал измерения для ' B', спасибо за то, что указали это. Изменено сейчас – Engineero

+0

В какой версии Matlab вам не нужно '@' перед '(x)'? Это другая ошибка, которую я пытался указать ... – Floris

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