Julia 朱莉娅:一的数组:把一加到零还是重复?

Julia 朱莉娅:一的数组:把一加到零还是重复?,julia,Julia,我有一个具体的数组,并希望有效地构建一个类似的数组,其中包含相同维度的数组推荐的方法是什么? 下面是一个随机数组: julia> A = rand(0:1, 10, 5) 10×5 Matrix{Int64}: 或A=rand(0:1,10,5)(在0.和/或1.上有一个点)用于浮点数的随机矩阵 有两种方法是很自然的。我可以这样做: julia> zero(A) .+ 1 5×10 Matrix{Int64}: 或者我可以这样做: julia> repeat(ones(si

我有一个具体的数组,并希望有效地构建一个类似的数组,其中包含相同维度的数组推荐的方法是什么?

下面是一个随机数组:

julia> A = rand(0:1, 10, 5)
10×5 Matrix{Int64}:
A=rand(0:1,10,5)
(在
0.
和/或
1.
上有一个点)用于浮点数的随机矩阵

有两种方法是很自然的。我可以这样做:

julia> zero(A) .+ 1
5×10 Matrix{Int64}:
或者我可以这样做:

julia> repeat(ones(size(A)[2])', outer = size(A)[1])
5×10 Matrix{Float64}:
第一种方法更加优雅。第二种方法感觉更笨拙,更容易出错(意外地交换
[1]
[2]
),但同时它不涉及加法操作,因此可能涉及更少的分配(或者可能不是因为编译器是超级智能的编辑:下面的快速基准表明编译器是超级智能的

当然,可能还有另一种更好的方法

using BenchmarkTools
A = rand(0:1, 1000, 1000)

@btime zero(A) .+ 1
## 1.609 ms (6 allocations: 15.26 MiB)

@btime repeat(ones(size(A)[2])', outer = size(A)[1])
## 3.032 ms (10 allocations: 7.64 MiB)
编辑2:跟进Bogumił的回答

以下为方便起见定义的单元数组
J
的方法是有效的:

function J(A::AbstractArray{T,N}) where {T,N}
    ones(T, size(A))
end
J(A)
@btime J(A)
## 789.929 μs (2 allocations: 7.63 MiB)
那么:

ones(Int, size(A))


在阅读文档之前的几分钟里,我认为
one(a)
1
会起到
zero(a)
0
的作用,但事实并非如此。不。
one
是一个标识数组(不同于
linearagebra.I
)。包
linearagebra
似乎没有“单位矩阵”(一个矩阵)类似于身份矩阵
I
。可能不太需要它。这不是你问题的核心,但如果你不知道的话,做
rand((0,1),N,N)
要比
rand(0:1,N,N)
快得多。你也可以做
rand(Bool,N,N)
来获得可笑的速度,或者
Random.bitrand(N,N)
用于格子。您希望对每个元素应用
一个
,而不是数组:
一个。(A)
。这也适用于奇怪的数组(如静态数组或GPU数组等)。@DNF,不,我不知道。很高兴知道,谢谢!非常好!
801.155μs(3次分配:7.63 MiB)
789.964μs(3次分配:7.63 MiB)
关于上述示例(请参阅我在回答时所做的编辑)。谢谢Bogumił!
fill(1, size(A))