Как я могу назначить переменную двухмерного массива большой плавающей матрице в Swift? - PullRequest
0 голосов
/ 11 февраля 2020

Мне нужно хранить и часто использовать пару относительно больших матриц (каждая 160 x 128, если быть точным) в Swift. Чтобы инициализировать постоянный двумерный массив Double для хранения этой матрицы, я написал что-то вроде этого: let myMatrix = [[3.2, 5.8976, 5.2], [1e-4, 0.3, 8.56]]. Этот массив 2 x 3 является лишь примером. Когда вы пытаетесь написать матрицу с плавающей точкой размером 160 x 128, это занимает много строк. Я набрал это длинное выражение, используя скрипт MATLAB, который я написал только для этого. Однако, когда я скопировал и вставил очень длинное выражение этой большой матрицы, XCode перестает отвечать. Он не может обрабатывать такие большие строки данных в файле «ViewController.swift». Итак, мне нужно найти другой способ хранения моих матриц в приложении iPhone. Я проверил форматы файлов "XML", "plist" и "CSV" для использования. К сожалению, ни один из них не работал для меня. Я ищу простое решение.

1 Ответ

1 голос
/ 11 февраля 2020

добро пожаловать в StackOverflow. Здесь есть несколько проблем, я постараюсь решить их все:

Нет двухмерных массивов

Технически , Swift не имеет двухмерных массивов (пока вы не реализуете один, то есть). То, что вы описываете - это вложенные массивы, которые имеют немного отличающиеся характеристики:

  1. Нет гарантии, что в таком массиве строки одинакового размера. Первый может иметь ширину 160, второй может быть пустым.
  2. Он имеет худшие характеристики производительности, поскольку представляет собой массив массивов, а не один непрерывный массив, содержащий все элементы. То есть он хранится ...

    • больше похоже на:

      array of arrays

    • чем как:

      contiguous storage

Что должен делать ViewController

Он должен контролировать взгляды. Хранение матрицы 160x128 для меня не похоже на «управление видом», и поэтому совершенно неуместно, чтобы такой код помещался туда

Компиляция больших выражений

Без подсказок типа средство проверки типа Swift оставлено для вывода типов в игре в нашем коде. Например, хотя [[1, 2, 3], [4, 5, 6]] может выглядеть как Array<Array<Int>>, на самом деле его можно использовать для инициализации ArraySlice<Set<Double>>, если этого требует контекст.

В Swift буквенные выражения могут иметь одно многих типов. Синтаксис в квадратных скобках, используемый для массива, может фактически использоваться для инициализации любого типа, соответствующего ExpressibleByArrayLiteral (например, Set, ArraySlice или любых таких типов, которые вы изобрели сами). Аналогично, целочисленные литералы можно использовать для инициализации любого типа, соответствующего ExpressibleByIntegerLiteral, например Float, Double и каждого варианта (U)Int(64|32|16|8). Взятые вместе, у литерала массива есть много возможных типов, которые могут быть, что очень долго оценивает проверку типов.

Вы можете помочь в этом, полностью указав тип (например, подсказка типа для переменной: let matrix: [[Double]] = [ ... ]. Но даже если эти данные слишком велики, чтобы их можно было поместить в файл Swift.

Использование формата сериализации

.. Это правильный путь к go. В этом случае, я думаю, что CSV, вероятно, является наиболее подходящим (он действительно хорош для хранения данных в виде квадратной таблицы) "и" CSV "форматы файлов" (я не знаю, что здесь означает "проверено") и что "один из тех, кто работал для меня" (не работал для вы ? что это значит, в коде есть некоторая проверка if (user == Serhat) dontWork()?). Это правильный подход для хорошего решения. Если вы застряли там, вы должны опубликовать вопрос, который дает более подробную информацию о том, что именно пошло не так, чтобы другие могли реально помочь вам.

...