gpt4 book ai didi

java - 在没有 for 循环的 Java 中乘法数组

转载 作者:行者123 更新时间:2023-12-03 22:57:28 24 4
gpt4 key购买 nike

假设我有两个等长的数字数组。我想创建第三个数组:

c[0] = a[0] * b[0]
c[1] = a[1] * b[1]
...

如果我在 Matlab 中,我可以编写一个执行如下乘法的循环:

for i=1:length(a)
c(i) = a(i) * b(i);
end

但我知道最好避免 for 循环,并且有一种方法可以做到这一点,那就是:

c = a .* b; 

这对我来说很有意义,并且在两个 8192 长度的随机数数组上多次计时 (tic toc),.* 方法始终比 for 循环快 3 倍。

所以现在我想在 Java 中乘以数组。所以我写了一个 for 循环并说:

for (int i=0; i<a.length; i++) {
c[i] = a[i] * b[i];
}

我的问题是:是否有更好的方法来避免 for 循环?如果有,它会有所作为吗?在我看来,它在没有 for 循环的情况下运行得更快,因为它是并行而不是串行地乘以数字,但我不知道引擎盖下发生了什么(就像编译器自己展开循环一样)。

最佳答案

.* 比 Matlab 中的显式循环更快有(至少)两个原因。 显式 是指用 Matlab 代码编写的循环,而不是 Matlab 函数可能使用的内部 循环。原因是:

  • .*vectorized .这意味着,尽管它很可能在内部使用循环进行计算,但该循环已在 some faster language 中编码。比 Matlab 本身。
  • .*multithreaded ,因此它受益于并行运行的多个内核。

所以在Matlab中,只要有内置的向量化函数,就应该使用它。虽然 Matlab 的显式循环的速度近年来有所提高(例如,由于 JIT 编译),但它们仍然比其矢量化版本慢。

Java 遵循更传统的方法,其中显式循环是常态。它们并不慢,而且通常没有可以替代它们的向量化函数。所以我会说显式循环是 Java 的方式。

关于java - 在没有 for 循环的 Java 中乘法数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32898119/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com