【问题标题】:Multiply each element of a vector by each element of another vector将向量的每个元素乘以另一个向量的每个元素
【发布时间】:2018-10-07 14:13:16
【问题描述】:

我有两个非常大的列向量,AB,大小分别为 ax1bx1。我想通过为每个ij 计算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,避免双重循环?我实际的ab10^3 大。

【问题讨论】:

  • 您使用的是哪个版本的 MATLAB?如果您使用数组乘法(.*bsxfun(@times, ...)并提供列向量(例如 a-by-1)和行向量(例如 1-by-b),您可以获得结果想要(大小为 a*b),最多转置/reshape
  • 谢谢。如果我这样做A.*B,我会得到CC(i)=A(i)*B(i)。我有 Matlab 2017b,但我想要在 Matlab 2015b 上也能工作的东西。

标签: matlab vector vectorization multiplication elementwise-operations


【解决方案1】:

这是一个简单的数组乘法案例,可以从隐式(或显式)扩展中受益:

% 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(:).')。

【讨论】:

    【解决方案2】:

    您还可以计算向量的外积,得到所需项的矩阵:

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

    然后按照说明重塑输出。不确定是否更有效。

    【讨论】:

    • 您可以使用(:) 将它们强制为列,而不是假设形状。另外,请注意transpose.' 并且不是 '(这是共轭转置)。
    猜你喜欢
    • 1970-01-01
    • 2019-03-28
    • 2021-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-06
    相关资源
    最近更新 更多