📜  朱莉娅的细胞阵列

📅  最后修改于: 2021-05-18 00:33:06             🧑  作者: Mango

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

来到朱莉娅,朱莉娅的神奇之处之一就是它的类型系统。这是一种严格类型的语言。在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"]

输出:
朱莉娅细胞阵列01

因此可以说Array {Any}等同于Matlab单元阵列。它可以容纳不同数据类型的元素。

从常规数组创建单元格数组

可以使用Julia中的一些预定义方法,使用常规数组创建单元格数组。
让我们创建一个Int类型的数组,看看它是从常规数组单元数组的转换!

# 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)

输出:
朱莉娅细胞阵列02

当我们尝试在Integer类型的Array中推送浮点值时,上面的代码会产生错误。这表明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")

输出:
朱莉娅细胞阵列04

这会将常规数组转换为保存异类数据类型的值的单元数组。

2D阵列的单元阵列:

# 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"]

输出:
朱莉娅细胞阵列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)

输出:
朱莉娅细胞阵列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])

输出:
朱莉娅细胞阵列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]

输出:
朱莉娅细胞阵列08

单元阵列的使用

单元格数组就像常规的Julia数组一样。它们可用于各种应用程序,如DataFrames,Tuple等的表示形式。

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)

输出:
朱莉娅细胞阵列09

细胞阵列的优势:

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

细胞阵列的破坏:

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