Умножьте каждый элемент вектора на каждый элемент другого вектора - PullRequest
0 голосов
/ 07 октября 2018

У меня есть два очень больших вектора столбцов, A и B, размером ax1 и bx1 соответственно.Я хочу построить вектор C размером (b*a)x1, вычисляя A(i)*B(j) для каждого i и j.Чтобы проиллюстрировать, что я имею в виду:

clear
a=10^3;
b=10^3;
A=randn(a,1);
B=randn(b,1);
Ctemp=zeros(a,b);
for i=1:a
    for j=1:b
        Ctemp(i,j)=A(i)*B(j);
    end
end
C=reshape(Ctemp, a*b,1);

Вопрос: Есть ли более эффективный способ получения C, который позволяет избежать двойного цикла?Мои настоящие a и b больше 10^3.

Ответы [ 2 ]

0 голосов
/ 07 октября 2018

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

C = A*B'; % Assuming A,B are column vectors here

И впоследствии измените выходной результат, как указано.Не уверен, если более эффективно, хотя.

0 голосов
/ 07 октября 2018

Это простой случай умножения массива, который может извлечь выгоду из неявного (или явного) расширения:

% Implicit (R2016b and newer):
C = A(:) .* B(:).'; % optionally surround by reshape( ... , [], 1);

% "Explicit" (R2007a and newer):
C = bsxfun( @times, A(:), B(:).' );

Оттуда это просто вопрос изменения формы, как вы уже делаете (D = C(:)или D = C(:).').

...