【问题标题】:Multiplying arrays in Java without a for loop在没有for循环的Java中乘以数组
【发布时间】:2015-10-01 23:02:25
【问题描述】:

假设我有两个同样长的数字数组。我想创建第三个数组,这样:

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 循环的情况下运行得更快,因为它将数字相乘而不是串联,但我不知道引擎盖下发生了什么(就像编译器自己展开循环一样)。

【问题讨论】:

    标签: java arrays matlab


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 谢谢。你知道 Java 如何处理这些循环吗?它是否尝试并行运行一些东西?
    • @Adjwilley 我对 Java 不太了解,抱歉
    【解决方案2】:

    虽然您没有在 Matlab 中编写循环,但在下面,很可能存在某种循环,甚至可能不止一个(我们必须检查源代码)。 Matlab 中没有什么魔法。它只是一种“简化”的语言,下面会生成更复杂的代码。

    您的 Java 循环是正确的方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-10-24
      • 2011-08-28
      • 2020-12-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-24
      • 1970-01-01
      相关资源
      最近更新 更多