Реферирование 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
Удачи!