【问题标题】:Julia - Multiplication of values in an arrayJulia - 数组中值的乘法
【发布时间】:2018-04-18 15:47:36
【问题描述】:

如果我有一个包含随机值的数组 A,我想定义一个数组 B,其中每个 i 的长度为 A,B[i] = (A[i])²

首先,我尝试了以下代码:

using Distributions

A = rand(Uniform(1,10),1,20)

B = A

for i in 1:20
       B[i] = (A[i])^2
end

经过这些操作,我有A = B

A
1×20 Array{Float64,2}:
 26.0478  5.36654  99.675  23.18  …  1.54846  91.3444  9.41496  2.91666

B
1×20 Array{Float64,2}:
 26.0478  5.36654  99.675  23.18  …  1.54846  91.3444  9.41496  2.91666

所以我尝试了另一种方法:

B = A^2

出现以下错误:

ERROR: DimensionMismatch("A has dimensions (1,20) but B has dimensions (1,20)")

如果我这样做,例如,B = 2*A 它工作正常...

一些有用的想法?

谢谢

【问题讨论】:

  • 您在这里有一个重大误解:B = A 不会复制 - BA 将是相同数据的两个名称。您希望B = copy(A) 进行复制。
  • A^2 不起作用的原因是它与A*A 相同,并且不能将两个向量相乘。相反,您必须指定要逐个元素的操作,这就是 .* 将要做的。

标签: arrays julia broadcasting elementwise-operations


【解决方案1】:

我认为这里最简单的解决方案是通过. 使用广播。

julia> A = rand(Uniform(1,10),1,20)
1×20 Array{Float64,2}:
 8.84251  1.90331  8.5116  2.50216  …  1.67195  9.68628  4.05879  1.50231

julia> B = A .^ 2
1×20 Array{Float64,2}:
 78.19  3.62257  72.4473  6.26081  …  2.7954  93.8241  16.4738  2.25693

这会满足您的期望:

julia> A
1×20 Array{Float64,2}:
 8.84251  1.90331  8.5116  2.50216  …  1.67195  9.68628  4.05879  1.50231

julia> B
1×20 Array{Float64,2}:
 78.19  3.62257  72.4473  6.26081  …  2.7954  93.8241  16.4738  2.25693

这个. 运算符适用于任何函数,它的作用是将所有函数广播(应用)到数组/对象的每个元素。

这是一个带有自定义函数的示例:

julia> my_func(a) = a * 5
my_func (generic function with 1 method)

julia> my_func.(1:5)
5-element Array{Int64,1}:
  5
 10
 15
 20
 25

查看the docs 了解更多信息。

【讨论】:

  • 谢谢@niczky12
  • 你为什么要先B = copy(A) 然后B = B.^2?这是一个不必要的步骤,并且会进行额外的分配。为什么不直接拨打B = A.^2
  • 很公平。我只是想尽可能地关注原始问题。让我更新答案。
  • 另外,如果你把它改成A.=A.^2,它会再删除一份。
猜你喜欢
  • 2023-03-16
  • 1970-01-01
  • 1970-01-01
  • 2011-04-10
  • 1970-01-01
  • 2018-10-30
  • 1970-01-01
  • 2015-12-17
  • 1970-01-01
相关资源
最近更新 更多