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

Posted

技术标签:

【中文标题】在 MATLAB 中存储 imline 生成的对象的句柄【英文标题】:Storing handles of objects generated by imline in MATLAB 【发布时间】:2011-10-11 23:46:02 【问题描述】:

我正在尝试将一组对象句柄存储在一个数组中。这些对象是由 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]);

【问题讨论】:

一些代码示例将有助于理解您的问题(我没有问题分配带有 imline 句柄对象的矩阵条目) @Adam,你能插入一个 sn-p 来演示你如何填充矩阵吗? 上面的代码展示了我在理论上尝试做的事情。 @Adam,请看我对这个问题的回答。它解决了这个问题。您需要更改预先分配的方式才能使其正常工作。默认情况下,Matlab 变量为double How to preallocate an array of class in MATLAB? 的可能重复项 【参考方案1】:

使用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

【讨论】:

非常漂亮和干净。我没想到。【参考方案2】:

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

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

注意,上面的行不适用于imline,因为它将为矩阵中的每个其他 N*N-1 个 imline 对象调用默认构造函数并调用 @987654325 @ 不带参数强制用户与当前轴交互。

我的建议(如果您要预先分配)是在矩阵中显式地定义所有默认行:

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]

【讨论】:

谢谢,这行得通。在相关的说明中,MATLAB 是否有一个工具可以优化创建这种矩阵(不是循环,就像我们在这里所做的那样)? @Adam,这里的问题仅仅是imline对象的默认构造函数是一个交互函数。在大多数其他情况下,我们可以通过将对象分配给最后一个元素来构造整个数组。这是reference。请注意,生成对象数组的典型方法是使用循环。如果是我,并且我打算经常使用它,我会考虑派生一个继承自 imline 的新类,我在其中定义自己的构造函数。希望这会有所帮助。 谢谢,我会研究 classdef 以备将来使用。 @Adam,我已经更新了我的答案,包括你如何派生一个新类来实现相同的结果。 我在这里向@Amro 的实力低头。他的回答要干净得多。

以上是关于在 MATLAB 中存储 imline 生成的对象的句柄的主要内容,如果未能解决你的问题,请参考以下文章

MATLAB 朴素贝叶斯对象存储

可生成的matlab函数中的对象数组

操作存储在元胞数组中的矩阵——Matlab

MATLAB 函数 fminunc 生成错误

如何将数据从 MATLAB 存储到 Access DB?

在 MATLAB 中加载对象