2013-02-20 2 views
3

Новых в Matlab пришел из C/C++ ......Matlab OOP доступ к свойствам из массива объектов

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

Class sample 
    properties(GetAccess = 'public', SetAccess ='public') 
    ID; 
    Value; 
    end 

    methods 
     function obj = sample(id, value) 
      obj.ID = id; 
      obj.Value = value; 
     end 
    end 
end 

Затем я создаю матрицу, содержащую некоторые объекты.

x = sample.empty(3,0); 
x(1) = sample(1,3); 
x(2) = sample(1,4); 
x(3) = sample(1,5); 

Затем я хочу получить все значения из объектов и сохранить их в новом массиве.

y = x(:).Value; 

Это, однако, не удается, и только помещает значение х (3) в у ..... и:

y(:) = x(:).Value; 

Выдает ошибку.

Любая помощь будет оценена по достоинству. Я знаю, что могу сделать это с помощью циклов, но я стараюсь сделать это самым быстрым и эффективным способом.

ответ

5

Простой, но неинтуитивный

y=[x.Value] 

Почему? Ну x.Value не является непрерывным блоком памяти, поэтому его нельзя напрямую назначить массиву. Вызов x.Value возвращает член данных Value из каждого объекта x. Matlab рассматривает это как отдельные операции. Включив вызов в [], вы сообщаете Matlab, чтобы сформулировать смежный массив, объединив каждый результат. Затем это можно присвоить массиву парных разрядов, y.

EDIT:

Что касается Вашего комментария, приведенный выше код работает отлично, если х различной длины в различных объектов, т.е.. ,

x(1) = sample(1,3); 
x(2) = sample(1,[4 5 6]); 
x(3) = sample(1,[20 10]); 

Тогда

>> [x.Value] 

ans = 

    3  4  5  6 20 10 

Если вы имеете в виду вы хотите «у» быть рваный концом вектора, как можно с помощью вектора векторов в C++, вам нужно использовать обозначение массива клеток (фигурные скобки)

>> y = {x.Value} 

y = 

    [3] [1x3 double] [1x2 double] 
+1

а что, если значения в x.Value имеют различные длины ... – Neppinger

+0

Ака х имеет массивы, но они имеют неравные длины. – Neppinger

+1

См. Мои правки для деталей. 'x' содержит массив классов' sample'. Радости нестрогого типа! – learnvst

Смежные вопросы