Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
实现MatlabListener,它通知矩阵中有足够的数据_Matlab_Events_Listener - Fatal编程技术网

实现MatlabListener,它通知矩阵中有足够的数据

实现MatlabListener,它通知矩阵中有足够的数据,matlab,events,listener,Matlab,Events,Listener,我试图在我的MATLAB DAQ程序中实现一个侦听器,它会通知我所获取的数据矩阵中是否有足够的数据可用(然后保存备份等) 我知道数据采集工具箱中存在类似的事件'DataAvailable'和notifywhenadaavailable超过(触发事件时的频率)。不幸的是,工具箱不支持我的设备,我通过使用计时器并使用fprintf和fscanf(仪器控制工具箱)查询仪器值,自己设置了一个DAQ程序 对于实现这一点的第一种方法,我阅读了文档(即事件和侦听器语法),并尝试实现一个示例,其中空矩阵由For

我试图在我的MATLAB DAQ程序中实现一个侦听器,它会通知我所获取的数据矩阵中是否有足够的数据可用(然后保存备份等)

我知道数据采集工具箱中存在类似的事件
'DataAvailable'
notifywhenadaavailable超过
(触发事件时的频率)。不幸的是,工具箱不支持我的设备,我通过使用计时器并使用
fprintf
fscanf
(仪器控制工具箱)查询仪器值,自己设置了一个DAQ程序

对于实现这一点的第一种方法,我阅读了文档(即事件和侦听器语法),并尝试实现一个示例,其中空矩阵由
For
循环展开,侦听器在有例如100个可用数据点时发出通知。然而,我完全失败了,因为我不知道如何实现,侦听器如何“通知”这一点。是否可以创建“自己的”事件,或者MATLAB只能侦听文档中给定的现有事件

我不确定我是否正确理解了这个概念,如果有人能给我一个快速的概述,如果可能,以及如何可能,我会很高兴

下面是一个代码示例。我完全知道,它还不能像这样工作,但我希望它清楚地表明我正在努力做什么:

%% Class definition

classdef DAQClass < handle
   properties
  DataMatrix %Does this make sense to put the matrix as property?

                %Maybe better as event data?
   end
   events
      EnoughData
   end
   methods %Does it make sense to put the condition when to notify, in a    method??
    %how can I access it for my listener 
      function IfEnoughDataAvailable(obj,DataMatrix) 
         if (length(DataMatrix)>100)
            notify(obj,'EnoughData');
         end
      end
   end
end


%% Add listener, run code to fill data matrix

DAQObject=DAQClass;
DAQObject.DataMatrix=[];
lh = addlistener(DAQObject,'EnoughData',@reactToEvent);

for k=1:1000
    DAQObject.DataMatrix(k)=k;

end
%%类定义
classdef DAQClass<句柄
性质
DataMatrix%将矩阵作为属性有意义吗?
%也许作为事件数据更好?
结束
事件
足够的数据
结束
方法%在方法中设置何时通知的条件有意义吗??
%我如何为我的听众访问它
函数IfEnoughDataAvailable(obj、DataMatrix)
如果(长度(数据矩阵)>100)
通知(obj,“足够数据”);
结束
结束
结束
结束
%%添加侦听器,运行代码以填充数据矩阵
DAQObject=DAQClass;
数据矩阵=[];
lh=addlistener(DAQObject,'EnoughData',@reactoEvent);
对于k=1:1000
数据矩阵(k)=k;
结束

我会这样实现它,使用属性侦听器而不是侦听器(注意,我将
DataMatrix
设置为
SetObservable
):


请注意,
reactoEvent
方法本身执行长度检查,并且只要
DataMatrix
发生更改,就会调用
reactoEvent
。因此,您可能希望在其中加入一些逻辑,以便在
DataMatrix
增加到100以上时,只调用一次,而不是每次超过100时(例如,它可以处理
DataMatrix
的内容,然后将
DataMatrix
重置为
[]
,将其视为缓冲区。

你能提供一点代码吗?你可以在每次
fscanf
后检查,但你确实需要查看代码以提供更多建议。只需编辑我的问题:)
classdef DAQClass < handle
    properties (SetObservable)
        DataMatrix = []
    end
    properties (Access = private)
        DataMatrixListener
    end
    methods
        function obj = DAQClass
            obj.DataMatrixListener =...
                addlistener(obj, 'DataMatrix', 'PostSet', @obj.reactToEvent);
        end
        function reactToEvent(obj, ~, ~)
            if length(obj.DataMatrix)>100
                disp('Enough data available') % Do actual thing here
            end
        end
    end
end
>> d = DAQClass
d = 
  DAQClass with properties:

    DataMatrix: []
>> for i = 95:105
disp(i)
d.DataMatrix = 1:i;
end
    95
    96
    97
    98
    99
   100
   101
Enough data available
   102
Enough data available
   103
Enough data available
   104
Enough data available
   105
Enough data available