Поэлементное умножение матриц в Matlab
Итак, у меня есть следующие матрицы:
A = [1 2 3; 4 5 6];
B = [0.5 2 3];
Я пишу функцию в MATLAB, которая позволит мне умножать вектор и матрицу на элемент, если количество элементов в векторе соответствует количеству столбцов. В A
Есть 3 столбца:
1 2 3
4 5 6
B
также имеет 3 элемента, так что это должно работать. Я пытаюсь произвести следующий вывод на основе A
а также B
:
0.5 4 9
2 10 18
Мой код ниже. Кто-нибудь знает, что я делаю не так?
function C = lab11(mat, vec)
C = zeros(2,3);
[a, b] = size(mat);
[c, d] = size(vec);
for i = 1:a
for k = 1:b
for j = 1
C(i,k) = C(i,k) + A(i,j) * B(j,k);
end
end
end
end
2 ответа
Ссылка на г-на Аззамана, bsxfun
это способ пойти с этим. Однако, судя по названию вашей функции, это выглядит как домашнее задание, поэтому давайте придерживаться того, что у вас изначально. Таким образом, вам нужно написать только два for
петли. Вы бы использовали второй for
Цикл для индексации как вектора, так и столбцов матрицы одновременно. Внешний самый for
цикл будет иметь доступ к строкам матрицы. Кроме того, вы ссылаетесь A
а также B
, которые являются переменными, которые не существуют в вашем коде. Вы также инициализируете выходную матрицу C
быть 2 х 3 всегда. Вы хотите, чтобы он был такого же размера, как mat
, Я также удалил вашу проверку длины вектора, потому что вы ничего не делали с результатом.
В качестве таких:
function C = lab11(mat, vec)
[a, b] = size(mat);
C = zeros(a,b);
for i = 1:a
for k = 1:b
C(i,k) = mat(i,k) * vec(k);
end
end
end
Обратите особое внимание на то, что я сделал. Самый внешний for
цикл обращается к строкам mat
в то время как самый внутренний цикл обращается к столбцам mat
а также элементы vec
, Имейте в виду, что количество столбцов mat
должно быть таким же, как количество элементов в vec
, Возможно, вам следует проверить это в своем коде.
Если вам не нравится использовать bsxfun
подход, одна альтернатива состоит в том, чтобы взять вектор vec
и сделать из этого матрицу того же размера, что и mat
укладывая вектор vec
на вершине себя столько раз, сколько у нас строк mat
, После этого вы можете выполнять поэлементное умножение. Вы можете сделать это, используя repmat
который повторяет вектор или матрицы заданное число раз в любом измерении (ях), которое вы хотите. Таким образом, ваша функция будет упрощена до:
function C = lab11(mat, vec)
rows = size(mat, 1);
vec_mat = repmat(vec, rows, 1);
C = mat .* vec_mat;
end
Тем не менее, я бы лично пошел с bsxfun
маршрут. bsxfun
в основном делает то, что repmat
парадигма делает под капотом. Внутренне это гарантирует, что оба ваших входа имеют одинаковый размер. Если это не так, он реплицирует меньший массив / матрицу, пока он не станет того же размера, что и больший массив / матрица, а затем применяет поэлементную операцию к соответствующим элементам в обеих переменных. bsxfun
расшифровывается как Binary Singleton EXpansion FUNction, который представляет собой причудливый способ сказать именно то, о чем я только что говорил.
Следовательно, ваша функция еще более упрощена до:
function C = lab11(mat, vec)
C = bsxfun(@times, mat, vec);
end
Удачи!
MATLAB уже имеет функциональность, чтобы сделать это в bsxfun
функция. bsxfun
возьмут две матрицы и дублируют одноэлементные измерения, пока матрицы не будут одинакового размера, а затем выполнят двоичную операцию над двумя матрицами. Итак, для вашего примера вы бы просто сделали следующее:
C = bsxfun(@times,mat,vec);