2013-10-04 2 views
2

Я знаю, что в Matlab вы можете использовать «хорошие» векторные операции, такие как A*B или A.*Bоперации вектора Matlab (вектор + вектор (элемент))

Если у вас есть

A=[2, 2]; 
B=[3, 1]; 

это логика, вы не может использовать A*B. Вы можете использовать A.*B что такое A[1]*B[1], A[2]*B[2], а результат [6, 2].

Во многих "сценариев" Я пишу, я часто нужно использовать что-то, что приводит к:

[6, 6; 
2, 2] 

Поэтому в основном я должен использовать forcycle (что-то вроде :):

C=zeros(2,2); 
for i=1:size(A,1) 
    C(i,:)=A*B(i); 
end 

И я хотел бы спросить, как (если это возможно) переписать это без forcycles? Является ли это возможным? Это 2 вектора из 2 элементов, может быть, плохо для понимания того, что мне нужно. Так еще один пример:

A=[1,2,3,4,5] 
B=[2,4] 

Результат:

[2,4,6,8,10; 
4,8,12,16,20] 

в коротком что-то вроде:
C (1: конец < ==== GO одним элементом,:) = A * B (1: end < ===== GO BY ONE ELEMENT)
-> Возьмите вектор WHOLE A и умножьте его на FIRST-элемент в B и сохраните его в строке FIRST в матрице, в которой есть столбцы A и B.
-> Возьмите WHOLE вектор A и умножьте его на SECOND element в B и сохраните его в SECOND строке в матрице, где есть столбцы A и B.
-> Возьмите вектор WHOLE A и умножьте его на элемент THIRD в B и сохраните его в строке THIRD в матрице, в которой есть столбцы A и B строки ..
-> ...
-> Возьмите ВСЮ вектор а и умножить его на последний элемент в B и сохранить его в последней строке в матричная, что у а столбцы и строки B ..

ответ

4

You можно использовать bsxfun для этой цели

P = bsxfun(@times,A,B') 

Это дает

A = 1  2  3  4  5 
B = 2  4 


P = 2  4  6  8 10 
    4  8 12 16 20 
+0

будет try..thanks..bsxfun функции является то, что я действительно не понимаю, и я думал, что будет solution..got попробовать что ..thanks – piggy

+0

именно то, что мне нужно было делать..работать, как шарм .. спасибо вам большое .. и можете ли вы, пожалуйста, посоветовать мне немного больше .. у вас есть ссылка, где функции bsx хорошо объясняются, что я могу возможно, попытайтесь их понять? еще раз большое спасибо. answer found. – piggy

+0

Чтобы понять такую ​​функцию, вам, вероятно, придется играть с игрушечными примерами. Здесь 'bsxfun' использует вектор-столбец B (' B''), принимает по одному элементу за раз (сначала из B, затем второго) и применяет для каждой из них функцию 'times' (A раз одно значение B). – marsei

2

Альтернативным решением является использование матричного умножения:

[ones(size(B))'*A].*[B'*ones(size(A))] 
+0

Хорошее решение.Но я думаю, что мы оба можем согласиться, bsxfun - это немного более приятное решение (по крайней мере, для написания: D). Есть ли некоторые преимущества в этой альтернативе? Например, лучшее вычислительное время или более высокая производительность памяти? – piggy

+0

Согласен, bsxfun, вероятно, лучше и в краткости, и в скорости. Единственная причина, по которой это решение выглядит привлекательно для некоторых из нас, заключается в том, что он интуитивно понятен и читабельен. Это просто умножение вектора столбца [2x1] с вектором строки [1x5] для получения матрицы [2x5] и т. Д. ... – bla

+0

да, для «некоторых из нас» было хорошо сказано: D, когда я пытаюсь переписать его точно по моей проблеме я все еще получаю внутреннюю ошибку размеров матрицы ..: D..but в любом случае спасибо вам большое ... попробуйте поиграть с этим .. я хочу, по крайней мере, понять, что ..:] большое спасибо – piggy

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