gpt4 book ai didi

arrays - 如何从数据构造一个n维数组

转载 作者:行者123 更新时间:2023-11-28 06:03:14 24 4
gpt4 key购买 nike

我想创建一个函数,它接受一个一维数字数组和一个形状,并返回一个包含那些具有给定形状的数字的数组。例如,如果我给它数组 [1, 2, 3, 4] 和形状 [2, 2],我希望它给我二维数组 [[1, 2], [3, 4]]。

我知道这很简单,但我的问题是指定返回类型。我想避免只为函数使用 [Any] 返回类型。就像给定的形状是二维的,返回类型应该是 [[Int]]、3 维的 [[[Int]]] 等。我如何指定一个具有任意维数的整数数组作为返回类型?这可能吗?

我对 swift 还很陌生,所以我还没有完全理解它的全部原理。谢谢!

最佳答案

您所描述的是一个矩阵。这与数组数组不同。例如,下面是一个合法的 [[Int]],但却是一个非法的 Matrix2:

[[1, 2], [1]]

Swift 没有内置的矩阵类型。你必须建立自己的。有很多小项目可以寻找灵感。我不知道是否真的有足够成熟的方法来考虑完整的实现,但它们足以让您走上正轨。他们通常希望包括 Accelerate,如果您不需要它,这会大大增加复杂性。

任何 Matrix 类型的核心,如果你想构建自己的,都是这样的:

struct Matrix {
private var storage: [Int]
let rows: Int
let columns: Int

init(rows: Int, columns: Int) {

precondition(rows > 0 && columns > 0)

self.rows = rows
self.columns = columns
self.storage = Array(repeating: 0, count: rows * columns)
}

subscript(row: Int, column: Int) -> Int {
get {
return storage[row * columns + column]
}
set {
storage[row * columns + column] = newValue
}
}
}

关键是存储只是元素的平面数组,您可以按行和列下标。

这种设计的一个好处是你的问题几乎没有问题,因为你的输入就是存储。

extension Matrix {
enum Error: Swift.Error {
case invalidShape
}

init(rowMajorValues: [Int], rows: Int, columns: Int) throws {
self.init(rows: rows, columns: columns)
guard storage.count == rowMajorValues.count else {
throw Error.invalidShape
}
storage = rowMajorValues
}
}

关于arrays - 如何从数据构造一个n维数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48967659/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com