2015-10-27 5 views
2

Я пытаюсь прорисуть следующую структуру данных в 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. Что такое хороший общий подход к проблеме?

+0

С 'A.c = 1x1 структурой с полями [key key key2_index]' вы имели в виду 'A.c = 1x1 структуру с полями [key key2 key2_index]', правильно? – xeroqu

+0

Ahh. Спасибо, xeroqu. Я исправлю эту опечатку. – Maroon66

ответ

0

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

+0

Я вижу, что вы говорите, но я застрял в том, что мне дают. Сумасшедшая/неэффективная структура, которую я пытаюсь векторизовать, предоставляется мне, а не созданной мной. – Maroon66

+0

Вы также можете использовать простые структуры данных для выполнения вычислений, и как только вы закончите, вы можете преобразовать их в эту структуру. – xeroqu

+0

ОК. Может быть, я не понимаю, о чем вы говорите. Моя ситуация в том, что мне дается сложная сумасшедшая асимметричная частичная пустая структура, и я хочу преобразовать ее в простую структуру массивов, чтобы я мог легко и легко выполнять вычисления. – Maroon66