我正在开发一种各种模拟器作为业余爱好项目。我遇到问题的具体功能从矩阵中取出一行并每隔50毫秒提供一个函数,但我是Matlab脚本的新手,需要一些帮助。
每次定时器点击时,矩阵中的下一行应提供给函数“simulate_datapoint()”。 Simulate_datapoint()获取行,执行一些计算魔法并更新轨道数组中的复杂“轨道”对象。
这是一个试图解决这个问题的完全倒退的方式,还是我接近一个有效的解决方案?任何帮助将不胜感激。
以下是我现在所做的不起作用:
function simulate_data(data)
if ~ismatrix(data)
error('Input must be a matrix.')
end
tracks = tracks_init(); % create an array of 64 Track objects.
data_size = size(data,1); % number of rows in data.
i = 0;
running = 1;
t = timer('StartDelay', 1, 'Period', 0.05, 'TasksToExecute', data_size, ...
'ExecutionMode', 'fixedRate');
t.StopFcn = 'running = 0;';
t.TimerFcn = 'i = i+1; simulate_datapoint(tracks, data(i,:));';
disp('Starting timer.')
start(t);
while(running==1)
% do nothing, wait for timer to finish.
end
delete(t);
disp('Execution complete.')
end
答案 0 :(得分:1)
你非常接近工作原型。几点说明。
1)你的字符串为timerFn和stopFn指定的MATLAB函数不共享相同的内存地址,因此变量“i”没有意义且不能在它们之间共享
2)使用waitfor(myTimer)等待...为计时器。
下面的代码应该开始,我使用“嵌套函数”,它与调用函数共享范围,因此他们知道并与调用范围共享变量:
function simulate
iterCount = 0;
running = true;
t = timer('StartDelay', 1, 'Period', 0.05, 'TasksToExecute', 10, ...
'ExecutionMode', 'fixedRate');
t.StopFcn = @(source,event)myStopFn;
t.TimerFcn = @(source,event)myTimerFn;
disp('Starting timer.')
start(t);
waitfor(t);
delete(t);
disp('Execution complete.')
% These are NESTED functions, they have access to variables in the
% calling function's (simulate's) scope, like "iterCount"
% See: http://www.mathworks.com/help/matlab/matlab_prog/nested-functions.html
function myStopFn
running = false;
end
function myTimerFn
iterCount = iterCount + 1;
disp(iterCount);
end
end