2013-06-06 9 views
1

У меня есть следующий код:Как векторизовать векторно-матричную поэтапную операцию?

A = rand(N1,N2); 
b = rand(1,N1); 
B = zeros(N1,N2); 

for i=1:N1 
    for j=1:N2 
     B(i,j) = A(i,j)*b(i); 
    end 
end 

Вопрос заключается в том, чтобы записать его в векторной форме операции? Что-то вроде B(:,:) = A(:,:).*b(:).

+0

Поскольку все переменные являются нулями, в чем смысл? просто 'B = нули (N1, N2);' достаточно – bla

+0

Ваш внутренний цикл тривиально удален. Векторизация внешнего цикла - это то, что поддерживает Octave, но MATLAB этого не делает, хотя, как указано ниже, 'bsxfun' может быть быстрее, чем один явный цикл, и, конечно же, должен быть быстрее, чем вложенные явные циклы, которые вы указали выше. – user57368

+0

@ natan Я почти уверен, что OP поставил их там просто, чтобы проиллюстрировать размеры. У тебя наверняка есть какая-то вера в человека! – paddy

ответ

7

Простое использование для bsxfun:

B = bsxfun(@times, A, b') 
+0

, увеличивает ли производительность? – Alex

+5

Да, 'bsxfun' поразит ваши мелкие вложенные петли. знак равно – paddy

0

Вы также можете попробовать:

B = A*.(repmat(b,N2,1))'; 

Здесь, во-первых, вы производите N2 повторную версию вектора b и умножить его A в поэлементного образом

Смежные вопросы