【发布时间】: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
假设用户输入了一个值n,它进入以下for循环代码。有没有办法对以下代码进行矢量化?
A = 1:n
B = [1 1;1 1]
for i = 1:n
B = B + A(i)*B;
end
【问题讨论】:
标签: matlab for-loop vectorization
我们来看一个具体的例子:
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) * B 与 B * (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 + 1 的factorial,这样我们也可以使用MATLAB 的factorial 函数:
n = 5;
B = [1 1; 1 1];
B = B * factorial(n + 1)
【讨论】: