Векторизация структуры массива MATLAB с использованием параллельной обработки

Я пытаюсь векторизовать следующую структуру данных в Matlab, но не могу найти / кодировать эффективный способ.
A = 1x2 struct array с полями: [a, b, c]
A (1) = a: 1, b: 2, c: [1x1 struct]
A (1).c = ключ: 5
A (2) = a: 1, b: [], c: [1x3 struct]
A (2).c = 1x3 struct array с полями: [ключ, ключ2]
A (2).c (1).key = 3
A (2).c (2).key = 4
A (2).c (3).key = 7
A (2).c (1).key2 = 10
A (2).c (2).key2 = []
A (2).c (3).key2 = 17

Я знаю. Это крайне неэффективная структура данных. Вот почему я пытаюсь векторизовать его с помощью индекса, поэтому окончательная структура будет выглядеть
Структура A = 1x1 с полями [a, b, c, b_index, c_index]
Аа = [1 1]
Ab = [2]
A.b_index = [1]
Ac = 1x1 структура с полями [key key2 key2_index]
A.c_index = [1 2 2 2]
Эки = = [5 3 4 7]
Ackey2 = [10 17]
Ackey2_index = [2 4]

Моя попытка 1: сначала я попробовал parfor на каждом уровне (для этого примера, в частности: A, c, ключевые 3 уровня) с первым опросом, чтобы выяснить, является ли он пустым, какие данные в нем содержатся, нужно ли индексировать это поле. и затем vertcat (x. (fieldname)), если это не лист структуры. Но если это так, я упаковываю его в ячейку и рекурсивно опускаю, чтобы векторизовать.

Это работает, но, к сожалению, это занимает слишком много времени. Когда я создал профиль, он показал функцию распределения mex, которая работает все время. Я предполагаю, что это потому, что я делаю parfor на каждом уровне, поэтому MATLAB должен индексировать и распространять среди каждого работника очень часто на каждом уровне.

Моя попытка 2: я попытался сначала сделать полный обзор конструкции. Используйте значение uint8 для каждого поля. А затем на этапе комбинирования я использую vertcat, чтобы сначала проверить результаты опроса, чтобы увидеть, нужно ли мне индексировать и нужно ли делать cat(3,...) для поля данных. Но это память неэффективна и медленна на этапе обследования. И это не сильно ускоряется на этапе комбинации. Хотя индексация становится намного проще.

Я думаю, мои вопросы
1. Как я могу закодировать его таким образом, чтобы он только индексировал и распределял весь массив один раз, чтобы моя первая попытка была более эффективной, или моя вторая попытка - лучшая идея?
2. Что такое хороший общий подход к проблеме?

1 ответ

Мои два цента за ваш вопрос 2. Matlab's parfor работает быстрее на простых массивах / матрицах. Это связано с тем, что массивы заразно распределяются в памяти и, таким образом, обеспечивают более быстрый доступ и вычисления. Поэтому вместо сложных структур я бы предложил использовать более простые массивы и т. Д., Если вас больше интересует производительность вашей программы, а не читабельность.

Другие вопросы по тегам