0

Таким образом, у меня есть следующие матрицы:поэлементно матричного умножения в 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

Реферирование MrAzzaman, bsxfun путь пойти с этим. Однако, судя по имени вашей функции, это выглядит как домашнее задание, и поэтому давайте придерживаться того, что вы изначально. Таким образом, вам нужно написать только две петли for. Вы бы использовали второй цикл for, чтобы одновременно индексировать как вектор, так и столбцы матрицы. Внешний цикл for будет обращаться к строкам матрицы. Кроме того, вы ссылаетесь на A и B, которые являются переменными, которых нет в вашем коде. Вы также инициализируете выходную матрицу C равным 2 x 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 FUNTION, что является фантастическим способом сказать именно то, о чем я только что говорил.

Таким образом, ваша функция дополнительно упрощается до:

function C = lab11(mat, vec) 
C = bsxfun(@times, mat, vec); 
end 

Удачи!

4

MATLAB уже имеет функциональные возможности, чтобы сделать это в функции bsxfun. bsxfun возьмет две матрицы и дублирует размеры синглтона до тех пор, пока матрицы не будут одинакового размера, а затем выполнит двоичную операцию над двумя матрицами. Так, для примера, вы бы просто сделать следующее:

C = bsxfun(@times,mat,vec); 
Смежные вопросы