




Вот extension для simd_float4x4, который добавляет несостоятельныйinit, который принимает описание отладки и создает simd_float4x4. Это несостоятельныйinit, потому что строка может быть неправильно сформирована.
import simd
extension simd_float4x4 {
init?(_ string: String) {
let prefix = "simd_float4x4"
guard string.hasPrefix(prefix) else { return nil }
let csv = string.dropFirst(prefix.count).components(separatedBy: ",")
let filtered = csv.map { $0.filter { Array("-01234567890.").contains($0) } }
let floats = filtered.compactMap(Float.init)
guard floats.count == 16 else { return nil }
let f0 = float4(Array(floats[0...3]))
let f1 = float4(Array(floats[4...7]))
let f2 = float4(Array(floats[8...11]))
let f3 = float4(Array(floats[12...15]))
self = simd_float4x4(f0, f1, f2, f3)
}
}
Контрольная работа
let col0 = float4(0.1, 0.2, 0.3, 0.4)
let col1 = float4(1.1, 1.2, 1.3, 1.4)
let col2 = float4(2.1, 2.2, 2.3, 2.4)
let col3 = float4(-3.1, -3.2, -3.3, -3.4)
var x = simd_float4x4(col0, col1, col2, col3)
print(x)
let xDesc = x.debugDescription
if let y = simd_float4x4(xDesc) {
print(y)
}
Выход
simd_float4x4([[0.1, 0.2, 0.3, 0.4)], [1.1, 1.2, 1.3, 1.4)], [2.1, 2.2, 2.3, 2.4)], [-3.1, -3.2, -3.3, -3.4)]]) simd_float4x4([[0.1, 0.2, 0.3, 0.4)], [1.1, 1.2, 1.3, 1.4)], [2.1, 2.2, 2.3, 2.4)], [-3.1, -3.2, -3.3, -3.4)]])
Вы ищете эффективную SIMD-реализацию
atof()? В Как реализовать atoi с помощью SIMD? есть x86 SIMDatoi(), но NEON имеет другие инструкции горизонтального добавления. Если вы хотите разобрать запятые, Самый быстрый способ получить адрес IPv4 из строки может быть интересным, но опять же, это очень специфично для x86. У ARM нетpmovmskb. (И значения FP произвольной длины в виде строк не будут работать, в отличие от четырехугольников с точками).