📜  Julia 中的元胞数组

📅  最后修改于: 2021-09-07 02:01:52             🧑  作者: Mango

元胞数组是一种带有索引数据容器的抽象数据类型,称为元胞,其中每个元胞可以包含任何类型的数据。它通常在 Matlab 中用于存储数据。

谈到 Julia,Julia 的神奇之处之一就是它的类型系统。它是一种严格类型的语言。在 Julia 中,数组可以包含同构[1, 2, 3]或异构类型[1, 2.5, “3”] 的值。默认情况下,Julia 会尝试将值提升为通用的具体类型。如果 Julia 不能提升包含的类型,则结果数组将是抽象类型Any

例子:

# Creating an Array of type Int 
[1, 2, 3]
  
# Creating an Array of type Float
[1, 2.5, 3]
  
# Creating an Array of type Any
[1, 2.3, "3"]

输出:
Julia-Cell-Array-01

所以可以说Array{Any}等价于 Matlab 元胞数组。它可以保存不同数据类型的元素。

从常规数组创建元胞数组

可以使用 Julia 中的一些预定义方法使用常规数组创建元胞数组。
让我们创建一个Int类型的Array并查看它从常规ArrayCell Array的转换!

# Creating an Array of type Int
a = [1, 2, 3]
      
# push an Int into the Array
push!(a, 5)
   
# So the type Int is retained
  
# Push a Float value into the Array
push!(a, 5.2)

输出:
Julia-Cell-Array-02

当我们尝试在整数类型数组中推送浮点值时,上面的代码会产生错误。这表明 Julia 是严格类型的,不允许推送任何其他数据类型的元素。

更改数组的数据类型:默认情况下,Julia 不会更改数组的类型,因此它不允许在数组中推送不同类型的值。这可以通过使用外部包来避免。

例子:

# A special package to allow extended operations with push!()
# Install it by typing "add BangBang"
using BangBang
  
# Creating an Array of type Int
a = [1, 2, 3]
      
# push an Int into the Array
push!(a, 5)
  
# Let's try to push the Float value now
push!!(a, 5.2)

输出:

上面的代码将Array转换为Float64,类似的也可以用来转换为字符串数组等。

例子:

using BangBang
  
# Creating an Array of type Int
a = [1, 2, 3]
      
# push an Int into the Array
push!(a, 5)
  
# Pushing the Float value
push!!(a, 5.2)
  
# Let's try to store a different data type now
push!!(a, "GeeksForGeeks")

输出:
Julia-Cell-Array-04

这会将常规数组转换为包含异构数据类型值的元胞数组。

二维数组的元胞数组:

# Create a 2x2 Array of type Int
[1 2 ; 3 4]
     
# Create a 2x2 Array of type Float
[1 2 ; 3 4.2] 
  
# Create a 2x2 Cell Array, of type Any
[1 2 ; 3 "foo"]

输出:
Julia-Cell-Array-05

3D 数组的元胞数组:

# Create a 2x2x2 Array of type Int
cat([1 2; 3 4], [5 6; 7 8], dims=3)
     
# Create a 2x2x2 Cell Array, of type Any
cat([1 "foo"; 3.2 4], [5 "baz"; 7 8], dims=3)

输出:
Julia-Cell-Array-06

向元胞数组添加行

可以使用push!()函数其他行添加到元胞数组的末尾。

# Create 3 element Cell Array, 
# that contains sub-arrays of type Any
c = [[10 20 "GeeksForGeeks"], [40.0], [50 60]]
     
# push a row Cell Array, of type Any
c = push!(c, [1 2 10])

输出:
Julia-Cell-Array-07

在元胞数组中存储元胞数组:

# Create two, 3 element Cell Arrays i and j
i = [2, 3.0, "GeeksForGeeks"]
j = [2.3, 3.3, "CellArrays"]
      
# Create a 3x2 Array
IJ = [i j]

输出:
Julia-Cell-Array-08

元胞数组的使用

元胞数组就像常规的 Julia 数组。它们用于各种应用程序,作为数据帧、元组等的表示。

Julia 中的元胞数组也用于存储函数的输入参数。

# Create two Arrays
i = [2, 3, 4]
j = [2.3, 3.3, 4.3]
  
# A function that uses values 
# from the above two arrays
function FOO(i, j)
    a = i + j
end
      
# Calling the function
FOO(i, j)

输出:
Julia-Cell-Array-09

单元阵列的优点:

  • 它们允许更大的灵活性来表示数据。
  • 它们不是为不同的类型创建不同的数组,而是提供一种节省空间的方式来将所有类型存储在一个数组中。
  • 它们提供了一种独特的数据类型“ Any ”,它允许各种数据类型。

元胞阵列的缺点:

  • 他们很慢。 Julia 是一种严格类型的语言(意味着类型是预定义的)
  • 我们丢失了有关数据的信息,例如:当我们将一个String值推入Float数组以将其转换为 Cell Array 时,它从Array{Float64 }类型变为Array{Any}类型,因此有关 Cell 中数据类型的信息阵列丢失。

如果您想与行业专家一起参加直播课程,请参阅Geeks Classes Live