matlab - 将实际值传递给 Matlab 中的回调函数

标签 matlab parameters callback

让我们假设以下简单示例:

f = figure;
plot(-10:10, (-10:10).^3, '*-r');
x = 1;
y = 1;
set(f, 'ResizeFcn', {@resizeCallback2, x, y});

while 1
    [x, y, button] = ginput(1);
    if(button ~= 1)
        break;
    end

    set(f, 'ResizeFcn', {@resizeCallback2, x, y});
end

%%--------------------------
function resizeCallback2(hFig, ~, foo, bar)    
    foo
    bar
end

有没有更简单的方法来始终将 x 和 y 的实际*值传递给回调函数,而不必总是在循环中更新它? 谢谢!

最佳答案

看起来您正在尝试存储鼠标单击位置的值,然后将这些值用作调整大小函数(稍后将调用)的一部分。我会做出一些改变。

首先,使用另一个回调来捕获鼠标单击,而不是使用 while 循环。例如,您可以使用图 ButtonDownFcn 回调来触发一个函数,该函数旨在将鼠标位置捕获到某个位置。

其次,有更好的方法来存储鼠标位置,正确的方法取决于您的技能水平和程序的需求。其中一些存储数据的方法是:

  1. 在另一个回调的参数中,就像您现在所做的那样。这非常痛苦,但可能有效。因此,如果它足以满足您的需求,您可以保留它。

  2. 大多数 Matlab 对象中的“userdata”字段。有几个人提出了这个,并且效果很好。我不喜欢依赖这个,因为我总是担心其他一些工具也想使用 userdata 字段,并且这些工具会覆盖数据。

  3. 全局变量值。我也不喜欢使用全局变量,出于同样的原因我不喜欢使用 userdata 字段。但无论如何,全局变量有时是最好的解决方案。如果您一次只有一个图形,这可能是最简单、最省力的解决方案。 (多个数字将促使您选择 userdata 解决方案作为最简单的解决方案。)

  4. 提供一个 handle 类来存储一些数据(即 x 和 y),并将该类的副本提供给两个回调(ButtonDownFcnResizeFcn)。这允许两个函数传递数据,而不会污染其他任何人的 namespace 。这是我最喜欢的此类问题的解决方案,因此我将在下面对其进行更详细的描述。

<小时/>

要执行上面的选项 (4),需要一个类来存储如下所示的数据:

    classdef ApplicationData < handle
        properties (SetAccess = public, GetAccess = public)
            x = [];
            y = [];
        end
    end

请注意,由于 ApplicationData 扩展了 handle,Matlab 将其视为传递引用对象,这对我们很有用。

然后您可以创建此类的实例,并将其赋予每个回调函数。

    dataPassing = ApplicationData;
    set(f, 'ButtonDownFcn', @(x,y) mouseClickCapture(x,y,dataPassing));
    set(f, 'ResizeFcn',     @(x,y) resizeCallback2(x,y, dataPassing));

mouseClickCapture 看起来像这样:

    function mouseClickCapture(hAxis, ignored, dataPassingClass)
    mousePositionData = get(hAxis,'CurrentPoint');
    dataPassingClass.x = mousePositionData(1,1);
    dataPassingClass.y = mousePositionData(1,2);

你的resizeCallback2看起来像这样:

    function resizeCallback2(h, ignored, dataPassingClass)
    %Do something here using 
    %dataPassingClass.x
    %and
    %dataPassingClass.y

关于matlab - 将实际值传递给 Matlab 中的回调函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8531286/

相关文章:

delphi - 传递序数参数

python - SWIG 将参数传递给 python 回调函数

python - Python 3中,将np.array对象类型转换为float类型,对象元素个数可变

matlab - 旋转矩阵不正交

matlab - 将值分配给向量中的几个单元格

matlab - 特征值将矩阵转换为向量

ruby-on-rails - 我不确定参数哈希

windows - 批处理脚本传递多个参数调用

c++ - 从列表中删除回调函数?

callback - 什么是回调?