Можете ли вы хранить и запрашивать составные данные массивов и структур Matlab в базе данных? - PullRequest
1 голос
/ 29 апреля 2019

Как сохранить массивы Matlab, расположенные в «структуре внутри структуры в структуре», в базе данных, чтобы я мог затем получить поля и массивы?

Подробнее о том, зачем мне это нужно, ниже:

У меня есть тонны данных, сохраненных в виде файлов .mat ... проблема в том, что мне нужно загрузить полный файл .mat, чтобы начать манипулировать и строить там данные.Если этот файл имеет большой размер, становится достаточно просто загрузить его в память.

Эти файлы .mat получены в результате анализа необработанных данных электрических измерений транзисторов.Все файлы .mat имеют одинаковую структуру, но каждый файл соответствует отдельному и уникальному транзистору.

Теперь скажите, что я хочу сравнить определенный параметр во всех транзисторах, которые распространены в A и B, я должен искать вручнуюи загрузите все .mat файлы, которые мне нужны, а затем попробуйте сделать сравнение.Не существует простого способа объединить все эти файлы .mat в один файл .mat (поскольку все они имеют одинаковые имена переменных, но с разными данными).Даже если это возможно, я не знаю способа запрашивать конкретные записи из файлов .mat.

Я не вижу способа легко сделать это без структурированной базы данных, из которой я могу запрашивать конкретные записи.Затем я могу использовать любой язык программирования (продолжить с Matlab или переключиться на python), чтобы удобно выполнять сравнение и построение графиков ... и т. Д.без хлопот разбросанных файлов .mat.

Проблема заключается в том, что данные в файлах .mat структурированы в структуры и большие массивы.Из того, что я знаю, хранение этого в простой базе данных SQL не является прямой задачей.Я посмотрел с помощью HDF5, но из примеров , которые я видел, мне нужно выполнить много низкоуровневых команд, чтобы сохранить эти структуры в файле HDF, и я не уверен, смогу ли я загрузить части HDFфайл в Matlab / python или если мне также нужно сначала загрузить весь файл в память.

Цель здесь - объединить все существующие (и будущие) файлы .mat (с ихсоставные данные (структура структур и массивов) в единый файл базы данных, из которого я могу запрашивать определенные записи.Есть ли решение для базы данных, которое может сохранить структуру моих сложных данных?HDF - это путь?или есть простое решение, которое мне не хватает?

РЕДАКТИРОВАТЬ:

Пример данных, которые мне нужно сохранить и получить:

All(16).rf.SS(3,2).data

Где Allэто массив структур с 7 полями.Каждая структура в поле rf является структурой с массивами, целыми числами, строками и структурами.Одна из этих структур называется SS, которая, в свою очередь, представляет собой массив структур, каждая из которых содержит массив 2x2 с именем data.

.

1 Ответ

2 голосов
/ 29 апреля 2019

Объединение файлов .mat в одну структуру данных.

. В общем случае неправильно Нет простого способа объединить файлы .mat в один файл .mat (поскольку все они имеютте же имена переменных, но с разными данными) .

Допустим, у вас есть два файла data1.mat и data2.mat, и каждый из них содержит две переменные a и b.Вы можете сделать:

>> s = load('data1')
s = 
  struct with fields:

    a: 'foo'
    b: 3

>> s(2) = load('data2')
s = 
  1×2 struct array with fields:
    a
    b

Теперь у вас есть массив массивов (см. Примечание ниже) .Вы можете получить доступ к данным в нем следующим образом:

>> s(1).a
ans =
    'foo'

>> s(2).a
ans =
    'bar'

Но вы также можете получить все значения сразу для каждого поля, как список через запятую , который вы можете назначитьк массиву или матрице ячеек:

>> s.a
ans =
    'foo'
ans =
    'bar'

>> allAs = {s.a}
allAs =
  1×2 cell array
    {'foo'}    {'bar'}

>> allBs = [s.b]
allBs =
     3     4

Примечание: Удивительно, но кажется, что вам нужно создать структуру с правильными полями, прежде чем вы сможете назначить ее с помощью индексации.Другими словами

s = struct;
s(1) = load('data1')

не будет работать, но

s = struct('a', [], 'b', [])
s(1) = load('data1')

в порядке.

Создание индекса для файлов .mat

Если вам не нужно искать по всем данным в каждом файле .mat, только по определенным полям, вы можете создать индекс в MATLAB, содержащий только соответствующие метаданные из каждого файла .mat плюс ссылку (например, имя файла)в сам файл.Это менее надежное решение в качестве долгосрочного решения, поскольку необходимо убедиться, что индекс синхронизирован с файлами, но для его настройки требуется меньше усилий.

Сведение структуры данных в базу данных, совместимуюtable

Если вы действительно хотите сохранить все в базе данных, вы можете преобразовать свою структуру данных в табличную форму, где любые многомерные элементы, такие как структуры или массивы, «сплющиваются» в строку таблицы с однимскалярное значение для (с соответствующим именем) табличной переменной.

Например, если у вас есть структура s с полями s.a и s.b, а s.b - матрица 2 x 2, вы можете вызывать переменные s_a, s_b_1_1,s_b_1_2, s_b_2_1 и s_b_2_2 - возможно, не идеальный дизайн базы данных, но вы поняли идею.

Вы должны быть в состоянии адаптировать код в этом ответе и / или представлениях обмена файлами MATLAB flattenstruct2cell и flatten-nested-cell-arrays для удовлетворения ваших потребностей.

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