Я разрабатываю определенную функцию для алгоритма моделирования конечных элементов высокого порядка в Matlab, и мне интересно, что является хорошим способом реализации определенной задачи. Я считаю, что столкнулся с довольно распространенной проблемой, но, немного покопавшись, я не нашел хорошего решения.
По сути, у меня есть длинный список идентификаторов (соответствующих определенным узлам в моей сетке), где каждый идентификатор связан с небольшим набором данных. Затем, когда я запускаю свой решатель, мне нужно получить доступ к данным, связанным с этими узлами, и обновить данные (несколько раз).
Итак, например, допустим, что это мой список этих конкретных узлов:
nodelist = [3 27 38] %(so these are my node ID's)
Затем для каждого узла у меня есть следующий набор данных, связанный
a (scalar)
b (5x5 double matrix)
c (10x1 double vector)
(a total of 36 double values associated with each node ID)
На самом деле у меня, конечно, будет гораздо более длинный список идентификаторов узлов и несколько больший набор данных, связанных с каждым узлом (но все же только двойные скаляры, матрицы и векторы (без символов, строк и т. д.)).
Подход 1
Поэтому один подход, который я придумал, состоит в том, чтобы просто хранить все в двумерной двойной матрице, а затем выполнять относительно сложную индексацию для доступа к моим данным, когда это необходимо. Для приведенного выше примера размер моей 2D-матрицы будет
size(2Dmat) = [length(nodelist), 36]
Скажем, я хотел получить доступ к b(3,3) для узла ID 27, я бы получил доступ к 2Dmat(2,14).
В принципе, это работает, но код просто не очень чистый и читабельный из-за этой сложной индексации (не говоря уже о том, что когда я что-то меняю в способе настройки набора данных, мне нужно перенастраивать весь код индексации ).
Подход 2
Другой подход заключается в использовании какой-то структуры для каждого узла в списке узлов:
a = 4.4;
b = rand(5,5);
c = rand(10,1);
s = struct('a',a,'b',b,'c',c)
И тогда я могу получить доступ к данным, например, через s.b(3,3) и т. д. Но я просто не знаю, как связать структуру с идентификатором узла?
Подход 3
Последнее, о чем я мог подумать, это настроить какую-то базу данных SQL, но это кажется излишним. Кроме того, мне нужно, чтобы мой код был максимально быстрым, поскольку мне нужно много-много раз обращаться к этим полям в наборах данных, связанных с этими выбранными узлами, и я полагаю, что выполнение некоторых запросов к базе данных замедлит работу.
Обратите внимание, что в конечном итоге я конвертирую код из Matlab в C/C++, поэтому я бы предпочел реализовать что-то, что не сильно зависит от некоторых специфических функций Matlab.
Итак, какие мысли о том, как реализовать эту функциональность чистым способом? Я надеюсь, что мой вопрос имеет смысл и спасибо заранее!
cells
иcell arrays
. - person High Performance Mark   schedule 14.04.2019