Я пытаюсь прорисуть следующую структуру данных в Matlab, но я не могу найти/код эффективным способом.
А = 1x2 структура массив с полями: [а, б, в]
А (1) = а: 1, б: 2, с: [1x1 структура]
А (1) .c = ключ: 5
а (2) = а: 1, б: [], с: [1x3 STRUCT]
A (2) .c = 1x3 массив структуры с полями: [ключ, ключ2]
а (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 = []
А (2) .c (3) .ключ2 = 17
Матричная структура массива MATLAB с использованием параллельной обработки
Я знаю. Это очень неэффективная структура данных. Вот почему я пытаюсь векторизации его с индексом, поэтому окончательная структура будет выглядеть
A = структура 1x1 с полями [а, Ь, с, b_index, c_index]
Аа = [1 1]
Ab = [2]
A.b_index = [1]
Ас = 1x1 структура с полями [ключ] ключ2 key2_index
A.c_index = [1 2 2 2]
Ackey = [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. Как я могу написать код таким образом, чтобы parfor только индекс и распределить весь массив один раз, чтобы моя первая попытка может быть более эффективным, или это моя вторая попытка лучшая идея ?
2. Что такое хороший общий подход к проблеме?
С 'A.c = 1x1 структурой с полями [key key key2_index]' вы имели в виду 'A.c = 1x1 структуру с полями [key key2 key2_index]', правильно? – xeroqu
Ahh. Спасибо, xeroqu. Я исправлю эту опечатку. – Maroon66