Поэлементное умножение матриц в 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);
Другие вопросы по тегам