Как мне нужно умножить группу элементов вместо одного элемента в матрице умножения - PullRequest
0 голосов
/ 27 февраля 2019

Предположим, у меня есть матрица размерности [4x4] и вектор [16x1], мне нужно умножить каждые 4 элемента вектора на один элемент в матрице (вместо умножения элемента в строке на элемент в векторе), как я могу сделать это с помощью цикла?

Например, здесь ниже результаты первых четырех элементов в результирующем векторе, как показано в примере ниже, затем то же самое для второй, третьей и четвертой строк в матрице.:

enter image description here

Итак, в этом примере результаты должны быть [16x1]

Спасибо

Ответы [ 4 ]

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

Используя kron, вы можете использовать эту однострочную строку:

%A = [1 2 3 4; 5 6 7 8; 9 10 11 12; 13 14 15 16];
%v = [2 2 2 2 0 0 0 0 1 1 1 1 3 3 3 3].';
sum(kron(A,ones(4,4)).'.*v).'/4

Я использую тензорное произведение Кронекера, чтобы «повторить» 4x4 раз матрицу А.После этого это чистая алгебра.

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

Посмотрите, хотите ли вы:

A = [1 2 3 4; 5 6 7 8; 9 10 11 12; 13 14 15 16];
v = [2 2 2 2 0 0 0 0 1 1 1 1 3 3 3 3].';
r = reshape(sum(bsxfun(@times, permute(A, [3 2 1]), permute(reshape(v, 1, [], size(A,2)), [2 3 1])), 2), [], 1);

, что дает

r =
    17
    17
    17
    17
    41
    41
    41
    41
    65
    65
    65
    65
    89
    89
    89
    89
0 голосов
/ 27 февраля 2019

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

Вы можете использовать индексирование, чтобы превратить это в простое умножение матриц.На вопрос, на который я ответил уже сегодня, подробно рассказывается, как работает приведенная ниже индексация с использованием bsxfun, тогда мы просто reshape в конце:

% Setup
A = [1 2 3 4; 5 6 7 8; 9 10 11 12; 13 14 15 16];
v = [2 2 2 2 0 0 0 0 1 1 1 1 3 3 3 3].';

% Matrix mutliplication
r = numel(v)/size(A,1);
b = A * v( bsxfun( @plus, (1:r:numel(v)).', 0:r-1 ) );
% Make result a column vector
b = reshape( b.', [], 1 );
0 голосов
/ 27 февраля 2019

Есть детали, которые я предположил, но этот шутл сделает свое дело:

A=reshape(1:16,4,4).';
b=repelem([2,0,1,3],1,4).';

c=[];
for row=1:size(A,1)
     c=[ c; sum(reshape(repelem(A(row,:),4).*b.',4,[]),2)];
end

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


Если у вас нет доступа к repelem, взгляните на альтернативные коды, которые делают то же самое: Элементная репликация массива в Matlab

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