эффективность массива объектов в Matlab - PullRequest
6 голосов
/ 30 сентября 2010

Для моей работы я должен создать проект в Matlab, который не является моим языком выбора, и у меня есть несколько вопросов относительно эффективности.

В настоящее время я имею дело с набором точек с несколькими свойствами. Вместо того, чтобы помещать все это в отдельные массивы равной длины, я бы предпочел создать один массив объектов Point, используя пользовательские классы Matlab. Например:

% Point.m
classmethod Point < handle
  properties
    x, y, prop1, prop2
  end
end

% script.m
... % define x(100), y(100), prop1(100), prop2(100)
points(100) = Point; % this seems to be the way to allocate an object vector
for i = 1:100
  points(i).x = x(i); % copy values into object
  points(i).y = y(i);
  points(i).prop1 = prop1(i);
  points(i).prop2 = prop2(i);
end

Причина, по которой я предпочитаю вышеизложенное, является эстетической (объекты должны быть объектами) и практической, поскольку она позволяет мне легко создавать подмножества точек без необходимости индексировать несколько различных массивов.

Однако мне интересно, является ли это наиболее эффективным способом ведения дел, учитывая, что набор точек может вырасти довольно большим, порядка тысяч или десятков тысяч точек. Мои основные вопросы:

  1. Для моего понимания: как Matlab хранит объектные массивы в памяти? Как он обрабатывает объекты различного размера, зависящие от prop1, например, struct?
  2. Как это влияет на такие операции, как [points.x], что мне нужно было бы делать довольно часто? Считается ли это эффективной операцией?
  3. Есть ли лучший способ инициализировать массив объектов? Вышеприведенная конструкция цикла кажется крайне неэффективной.
  4. Я полагаю, что должна быть возможность имитировать объектоподобное поведение при более выгодном сохранении свойств, возможно, путем перегрузки subsref . Вы бы порекомендовали это?

Или, говоря более обобщенно: каков был бы оптимальный способ организации моих очков?

Ждем ваших советов!

1 Ответ

9 голосов
/ 30 сентября 2010

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

  1. Объекты хранятся в памяти так же, как и структуры - каждое поле представляет собой свой собственный полноценный массив MATLAB (от mxArray до C-Mex-программистов), поэтому размер каждого поля может быть независимым.
  2. Я бы, вероятно, сделал что-то вроде одного объекта PointList с полями x, y, prop1, prop2. Эти поля были бы векторами соответствующей длины. Это почти наверняка будет более эффективным, чем список объектов Point. Это, безусловно, займет меньше памяти.
  3. Вы должны определить методы доступа в PointList, чтобы ваши векторы всегда были одинаковой длины и т. Д.
  4. Если бы вы действительно этого хотели, у вашего PointList была бы «емкость», которая больше, чем количество элементов, хранящихся в нем в данный момент - таким образом, вы могли бы избежать изменения размера x, y, ... все время
  5. В общем случае перегрузка subref не для слабонервных. Имейте в виду, что вам также нужно правильно перегрузить как минимум цифры, ndims, длину, конец и размер.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...