Индекс вне диапазона: отображение вывода функции с 3 входами на трехмерный массив с плавающей точкой в ​​Swift 4 - PullRequest
0 голосов
/ 05 июля 2018

Я хочу установить элементы в изменяемом трехмерном массиве Double для вывода функции с 3 входами, f(), для позиции этого элемента в массиве ([a][n][b]), а затем распечатать массив.

//3-input function must input and output doubles. This function is an example.
func f(a: Double, n: Double, b: Double) -> Double {
    return a * n * b
}

//Size of array: 7*7*7
let aMax = 6
let nMax = 6
let bMax = 6

//Define mutable array; I don't know if I need to initialize array "points".
var points = [[[Double]]]()

//I don't know if I should use ".append" or "=".
for a in 0...aMax {
    for n in 0...nMax {
        for b in 0...bMax {
            points[a][n][b] = f(a: Double(a), n: Double(n), b: Double(b)) //Changing element at position results in "fatal error: Index out of range".
        }
    }
}

print(points)

Ответы [ 3 ]

0 голосов
/ 05 июля 2018

Вы можете попробовать это, для массива, объявленного как этот [[[Double]]], вы можете использовать только append, но для его назначения и индексации вы должны сначала инициализировать его следующим образом

//Size of array: 7*7*7
let aMax = 7
let nMax = 7
let bMax = 7

//Define mutable array; I don't know if I need to initialize array "points".
var points = [[[Double]]](repeating: [[Double]](repeating: [Double](repeating: 0, count: bMax), count: nMax), count: aMax)

//I don't know if I should use ".append" or "=".
for a in 0..<aMax {

    for n in 0..<nMax {

        for b in 0..<bMax {
            points[a][n][b] = (f(a: Double(a), n: Double(n), b: Double(b))) //Changing element at position results in "fatal error: Index out of range".
        }

    }

}

print(points)
0 голосов
/ 05 июля 2018

Вы можете объявить и инициализировать массив "3D" в одном кадре, используя Array.map(_:):

let (aCount, nCount, bCount) = (8, 8, 8)

let points: [[[Double]]] = (0 ..< aCount).map { aInt in
    let a = Double(aInt)

    return (0 ..< nCount).map { nInt in
        let n = Double(nInt)

        return (0 ..< bCount).map { bInt in
            return f(a: a, n: n, b: Double(bInt))
        }
    }
}
0 голосов
/ 05 июля 2018

Проблема в том, что после выполнения:

var points = [[[Double]]]()

points полностью пусто. Поэтому любая попытка доступа к любому из индексов приводит к ошибке «Индекс вне диапазона».

Поскольку вы собираетесь заполнить все это, инициализируйте три измерения, используя Array(repeating:count:).

var points = Array(repeating: Array(repeating: Array(repeating: 0.0, count: bMax + 1), count: nMax + 1), count: aMax + 1)

Теперь остальная часть вашего кода будет работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...