【问题标题】:How can I vectorize the following calculation?如何矢量化以下计算?
【发布时间】:2021-02-23 08:00:45
【问题描述】:

假设用户输入了一个值n,它进入以下for循环代码。有没有办法对以下代码进行矢量化?

A = 1:n
B = [1 1;1 1]
for i = 1:n
    B = B + A(i)*B;
end

【问题讨论】:

  • 到目前为止你有什么尝试?

标签: matlab for-loop vectorization


【解决方案1】:

我们来看一个具体的例子:

n = 5;
A = 1:n;
B = [1 1; 1 1];
for i = 1:n
    B = B + A(i) * B;
end
B

结果是:

B =
   720   720
   720   720

首先,我会重写循环:

n = 5;
A = 1:n;
B = [1 1; 1 1];
for i = 1:length(A)
    B = B * (A(i) + 1);
end
B

这样,更明显的是,您的循环变量 i 只是迭代了 A 中的所有元素。

另外:B + A(i) * BB * (A(i) + 1) 相同。

现在,我们看到,在循环内部,您基本上是在计算:

B = B * (A(1) + 1) * (A(2) + 1) * (A(3) + 1) ...

A(或此处:A + 1)中所有元素的乘积可以使用 MATLAB 的 prod 函数进行简化:

n = 5;
A = 1:n;
B = [1 1; 1 1];
B = B * prod(A + 1)

让我们检查一下结果:

B =
   720   720
   720   720

A = 1:n 的特殊情况下,乘积prod(A + 1) 就是n + 1factorial,这样我们也可以使用MATLAB 的factorial 函数:

n = 5;
B = [1 1; 1 1];
B = B * factorial(n + 1)

【讨论】:

    猜你喜欢
    • 2018-01-30
    • 1970-01-01
    • 2017-02-28
    • 1970-01-01
    • 1970-01-01
    • 2019-11-24
    • 1970-01-01
    • 1970-01-01
    • 2020-12-25
    相关资源
    最近更新 更多