【问题标题】:Simple way to multiply column elements by corresponding vector elements in MATLAB?在MATLAB中将列元素乘以相应向量元素的简单方法?
【发布时间】:2014-02-16 07:34:47
【问题描述】:

我想将 M × N 矩阵的每一列乘以大小为 N 的向量的对应元素。

我知道可以使用 for 循环。但我正在寻找一种更简单的方法。

【问题讨论】:

    标签: matlab matrix


    【解决方案1】:

    我想这就是你想要的:

    mat1=randi(10,[4 5]);
    vec1=randi(10,[1 5]);
    result=mat1.*repmat(vec1,[size(mat1,1),1]);
    

    rempat 将沿mat1 的行复制vec1。然后我们可以进行逐元素乘法(.*) 以“将M × N 矩阵的每一列乘以大小为N 的向量的对应元素”。

    编辑:只是添加到计算方面。我想让您知道repmat 的替代方案。矩阵索引可以实现与repmat 相同的行为并且速度更快。我从here 采用了这种技术。

    观察你可以写出下面的语句

    repmat(vec1,[size(mat1,1),1]);
    

    作为

    vec1([1:size(vec1,1)]'*ones(1,size(mat1,1)),:);
    

    如果你仔细观察,表达式可以归结为vec1([1]'*[1 1 1 1]),:);,这又是:

    vec1([1 1 1 1]),:);
    

    从而实现与repmat 相同的行为并更快。我运行了三个解决方案100000 次,即,

    1. 使用repmat 的解决方案:0.824518 秒
    2. 使用上述索引技术的解决方案:0.734435 秒
    3. 使用@LuisMendo 提供的bsxfun 的解决方案:0.683331 秒

    您可以观察到bsxfun 稍快。

    【讨论】:

    • @LuisMendo 是的,bsxfun 是最快的方法。
    【解决方案2】:

    虽然您可以使用repmat(如@Parag's answer)来实现,但通常more efficient 可以使用bsxfun。它还有一个优点是代码(最后一行)对于行向量和列向量是相同的。

    %// Example data
    M = 4;
    N = 5;
    matrix = rand(M,N);
    vector = rand(1,N); %// or size M,1
    
    %// Computation
    result = bsxfun(@times, matrix, vector); %// bsxfun does an "implicit" repmat
    

    【讨论】:

    • 如果 bsxfun 做了一个“隐式”repmat,效率在哪里?
    • @SAM 见here。我的猜测是bsxfun“知道”这些元素是相同的,所以在内部它不会像repmat 那样复制它们
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-23
    • 1970-01-01
    相关资源
    最近更新 更多