【问题标题】:Vectorizing a for loop in MATLAB在 MATLAB 中对 for 循环进行向量化
【发布时间】:2017-04-25 16:23:17
【问题描述】:

在 MATLAB 中,给定一个矩阵 A,我想创建一个矩阵 B,其中包含矩阵 A 的元素占第一列元素的百分比。下面的代码做到了:

A = randi(5,6);

B = zeros(size(A,1), size(A,2));
for kk = 1:size(A,2)
    B(:,kk) = (A(:,kk).*100)./ A(:,1)-100;
end

但是,如何通过矢量化在单行中实现相同的结果? arrayfun 在这件事上有用吗?

【问题讨论】:

  • ii 上的外层循环不执行任何操作,因此您只需将整个矩阵除以第一列即可。
  • @beaker 我刚刚编辑了问题以使其更清晰

标签: matlab for-loop vectorization


【解决方案1】:

在这种情况下使用bsxfun

B = bsxfun(@rdivide, 100 * A, A(:, 1)) - 100;

您的代码正在做的是获取矩阵A 的每一列并除以它的第一列。您正在做一些额外的缩放,例如在除法之前将所有列乘以 100,然后再减去。 bsxfun 在内部执行广播,这意味着它将临时创建一个新矩阵,该矩阵将第一列复制到与A 中一样多的列,并执行逐元素除法。您可以通过将矩阵预缩放 100,然后再减去 100 来完成您的逻辑。

使用 MATLAB R2016b,不需要 bsxfun,您可以通过算术运算在本地完成:

B = (100 * A) ./ A(:,1) - 100;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-12-06
    • 2013-12-22
    • 1970-01-01
    • 2015-06-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多