当前位置:K88软件开发文章中心编程语言非主流编程语言Julia → 文章内容

Julia 多维数组

减小字体 增大字体 作者:佚名  来源:网上搜集  发布时间:2019-1-15 16:28:18

行转换)。索引赋值语法等价于调用 setindex! : setindex!(A, X, I_1, I_2, ..., I_n)例如: julia> x = reshape(1:9, 3, 3) 3x3 Array{Int64,2}: 1 4 7 2 5 8 3 6 9 julia> x[1:2, 2:3] = -1 -1 julia> x 3x3 Array{Int64,2}: 1 -1 -1 2 -1 -1 3 6 9向量化的运算符和函数数组支持下列运算符。逐元素进行的运算,应使用带“点”(逐元素)版本的二元运算符。一元: -, +, !二元: +, -, *, .*, /, ./,\, .\, ^, .^, div, mod比较: .==, .!=, .<, .<=, .>, .>=一元布尔值或位运算: ~二元布尔值或位运算: &, |, $一些没有“点”(逐元素)操作运算符当一个参数是一个标量时会被使用。这些运算符有 *, /, \ 和按位运算符。请注意,像 == 操作这样的比较运算是操作在整个阵列上的,它会给出一个布尔返回值。逐位的比较使用点操作符。下列内置的函数也都是向量化的, 即函数是逐元素版本的: abs abs2 angle cbrt airy airyai airyaiprime airybi airybiprime airyprime acos acosh asin asinh atan atan2 atanh acsc acsch asec asech acot acoth cos cospi cosh sin sinpi sinh tan tanh sinc cosc csc csch sec sech cot coth acosd asind atand asecd acscd acotd cosd sind tand secd cscd cotd besselh besseli besselj besselj0 besselj1 besselk bessely bessely0 bessely1 exp erf erfc erfinv erfcinv exp2 expm1 beta dawson digamma erfcx erfi exponent eta zeta gamma hankelh1 hankelh2 ceil floor round trunc iceil ifloor iround itrunc isfinite isinf isnan lbeta lfact lgamma log log10 log1p log2 copysign max min significand sqrt hypot注意 min max 和 minimum maximum 之间的区别,前者是对多个数组操作,找出各数组对应的的元素中的最大最小,后者是作用在一个数组上找出该数组的最大最小值。Julia 提供了 @vectorize_1arg 和 @vectorize_2arg 两个宏,分别用来向量化任意的单参数或两个参数的函数。每个宏都接收两个参数,即函数参数的类型和函数名。例如: julia> square(x) = x^2 square (generic function with 1 method) julia> @vectorize_1arg Number square square (generic function with 4 methods) julia> methods(square) # 4 methods for generic function "square": square{T<:Number}(::AbstractArray{T<:Number,1}) at operators.jl:359 square{T<:Number}(::AbstractArray{T<:Number,2}) at operators.jl:360 square{T<:Number}(::AbstractArray{T<:Number,N}) at operators.jl:362 square(x) at none:1 julia> square([1 2 4; 5 6 7]) 2x3 Array{Int64,2}: 1 4 16 25 36 49Broadcasting有时要对不同维度的数组进行逐元素的二元运算,如将向量加到矩阵的每一列。低效的方法是,把向量复制成同维度的矩阵: julia> a = rand(2,1); A = rand(2,3); julia> repmat(a,1,3)+A 2x3 Array{Float64,2}: 1.20813 1.82068 1.25387 1.56851 1.86401 1.67846维度很大时,效率会很低。Julia 提供 broadcast 函数,它将数组参数的维度进行扩展,使其匹配另一个数组的对应维度,且不需要额外内存,最后再逐元素调用指定的二元函数: julia> broadcast(+, a, A) 2x3 Array{Float64,2}: 1.20813 1.82068 1.25387 1.56851 1.86401 1.67846 julia> b = rand(1,2) 1x2 Array{Float64,2}: 0.867535 0.00457906 julia> broadcast(+, a, b) 2x2 Array{Float64,2}: 1.71056 0.847604 1.73659 0.873631逐元素的运算符,如 .+ 和 .* 将会在必要时进行 broadcasting 。还提供了 broadcast! 函数,可以明确指明目的,而 broadcast_getindex 和 broadcast_setindex! 函数可以在索引前对索引值做 broadcast。实现Julia 的基础数组类型是抽象类型 AbstractArray{T,N},其中维度为 N,元素类型为 T。AbstractVector 和 AbstractMatrix 分别是它 1 维和 2 维的别名。AbstractArray 类型包含任何形似数组的类型, 而且它的实现和通常的数组会很不一样。例如,任何具体的 AbstractArray{T,N} 至少要有 size(A) (返回 Int 多元组),getindex(A,i) 和 getindex(A,i1,...,iN) (返回 T 类型的一个元素), 可变的数组要能 setindex!。 这些操作都要求在近乎常数的时间复杂度或 O(1) 复杂度,否则某些数组函数就会特别慢。具体的类型也要提供类似于 similar(A,T=eltype(A),dims=size(A)) 的方法用来分配一个拷贝。DenseArray 是一个抽象的 AbstractArray 类型的亚型,它应该包括在内存的常规偏移上的所有数组,因此可以被传递到外部在此内存布局上的 C 和 Fortran 函数。亚型应该提供一个方法 stride(A,k),使之返回“跨越”的维度 k:向给出的维度 k 加 1 应该使 getindex(A,i) 中的 i 增加 stride(A,k)。如果提供了一个指针转换方法 convert(Ptr{T},A),那么内存布局应该以相同的方式对应于这些扩展。Array{T,N} 类型是 DenseArray 的特殊实例,它的元素以列序为主序存储(详见代码性能优化)。Vector 和 Matrix 是分别是它 1 维和 2 维的别名。SubArray 是 AbstractArray 的特殊实例,它通过引用而不是复制来进行索引。使用 sub 函数来构造 SubArray,它的调用方式与 getindex 相同(使用数组和一组索引参数)。sub 的结果与 getindex 的结果类似,但它的数据仍留在原地。sub 在 SubArray 对象中保存输入的索引向量,这个向量将被用来间接索引原数组。StridedVector 和 StridedMatrix 是为了方便而定义的别名。通过给他们传递 Array 或 SubArray 对象,可以使 Julia 大范围调用 BLAS 和 LAPACK 函数,提高内存申请和复制的效率。下面的例子计算大数组中的一个小块的 QR 分解,无需构造临时变量,直接调用合适的 LAPACK 函数。 julia> a = rand(10,10) 10x10 Array{Float64,2}: 0.561255 0.226678 0.203391 0.308912 … 0.750307 0.235023 0.217964 0.718915 0.537192 0.556946 0.9

上一页  [1] [2] [3]  下一页


Julia 多维数组