将一个向量的每个元素乘以另一个向量的每个元素
Multiply each element of a vector by each element of another vector
我有两个非常大的列向量,A
和 B
,大小分别为 ax1
和 bx1
。我想通过为每个 i
和 j
计算 A(i)*B(j)
来构造一个大小为 (b*a)x1
的向量 C
。为了说明我的意思:
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
大。
这是一个可以从隐式(或显式)扩展中获益的简单数组乘法示例:
% 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(:).'
)。
您还可以计算向量的外积,得到所需项的矩阵:
C = A*B'; % Assuming A,B are column vectors here
然后按照说明重塑输出。不确定是否更有效率。
我有两个非常大的列向量,A
和 B
,大小分别为 ax1
和 bx1
。我想通过为每个 i
和 j
计算 A(i)*B(j)
来构造一个大小为 (b*a)x1
的向量 C
。为了说明我的意思:
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
大。
这是一个可以从隐式(或显式)扩展中获益的简单数组乘法示例:
% 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(:).'
)。
您还可以计算向量的外积,得到所需项的矩阵:
C = A*B'; % Assuming A,B are column vectors here
然后按照说明重塑输出。不确定是否更有效率。