Хранение дескрипторов объектов, сгенерированных imline в MATLAB - PullRequest
2 голосов
/ 24 июля 2011

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

Я знаю, как это сделать - однако, когда я пытаюсь заполнить матрицу дескрипторами строк, возникает ошибка - MATLAB утверждает, что преобразование из IMLINE в DOUBLE невозможно.Это не происходит с другими типами объектов.Есть ли способ обойти это?

Вот какой-то псевдокод для пояснения:

lines=zeros(1,x);    % defining empty storage matrix
for idx=1:x
    line=imline(ax_handl,[x_1 y_1; x_2 y_2])
    set(line,'UserData',idx) % in order to identify independent lines with the number
    lines(idx)=line; % here I try to store a line handle as it's made
end

% now in the function responsible for motion of objects, I assign new position to line

line_num=get(gco,'UserData'); % this relates other objects associated with line number
setPosition(lines(line_num),[a b; c d]);

Ответы [ 2 ]

6 голосов
/ 24 июля 2011

Используйте статический метод empty для создания пустого массива типа класса:

lines = imline.empty(0,10);
for idx=1:10
    line = imline(gca, sortrows(rand(2,2)));
    set(line,'UserData',idx)
    lines(idx) = line;
end

enter image description here

1 голос
/ 24 июля 2011

Вам может потребоваться заполнить матрицу значениями по умолчанию для ее создания.Типичный подход к предварительному выделению матрицы объектов размером N заключается в простом назначении объекта последнему элементу в матрице.

M(N,N)=imline(gca,[NaN NaN],[NaN NaN]); %# set non-displayable vals for x and y

ПРИМЕЧАНИЕ. Строка выше не будет работать сimline, так как он вызовет конструктор по умолчанию для каждого из остальных N * N-1 встроенных объектов в матрице, а вызов imline без аргументов вынуждает пользователя взаимодействовать с текущей осью.

Мой совет (если вы предварительно выделяете) - определить все строки по умолчанию явно в матрице:

for k=1:N*N
    M(k)=imline(gca,[NaN NaN],[NaN NaN]);
end

%# Reshape (if necessary)
M = reshape(M,[N N]);

В качестве альтернативы, вы можете позволить Matlab заполнитьмассив для вас.Если вы обнаружите, что этот код вам часто понадобится, выведите новый класс из imline.В следующем примере показано наименьшее, что могло бы произойти.Это просто определяет конструктор.Этот пример позволяет вам передавать необязательные аргументы imline.Если аргументы не указаны, объект imline создается со значениями позиции, как указано выше.

classdef myimline<imline
    methods

        function obj = myimline(varargin)
            if isempty(varargin)
                varargin = {gca,[NaN NaN],[NaN NaN]};
            end
            obj = obj@imline(varargin{:});
        end
    end
end

Пример использования:

%# Generate a 100 element array of `imline` objects, 
%# but define the last one explicitly
mat(100)=myimline(gca,[0 1],[0 1]);

Последний myimline объект в массиве имеет точки, указанные в назначении, но остальные элементы имеют значения положения по умолчанию [NaN NaN] как указано выше.

...