在MATLAB中存储由imline生成的对象的句柄

时间:2011-07-24 10:48:53

标签: matlab properties line store handle

我正在尝试在数组中存储一组对象句柄。对象是由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 个答案:

答案 0 :(得分:6)

使用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 :(得分:1)

您可能需要使用默认值行填充矩阵才能创建它。预分配大小为N的对象矩阵的典型方法是简单地将对象分配给矩阵中的最后一个元素。

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

注意,上面的行不适用于imline ,因为它将为矩阵中的每个其他N * N-1个imline对象调用默认构造函数并调用没有参数的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]