小编Atz*_*nik的帖子

无阻塞调用外部程序而不会丢失返回代码

在Matlab中启动外部程序(简称为"EX")时,我可以这样做

[status, result] = system('EX.exe');
Run Code Online (Sandbox Code Playgroud)

哪个阻止直到EX返回,或者像这样

[status, result] = system('start EX.exe');
Run Code Online (Sandbox Code Playgroud)

它立即返回Matlab但无法获取EX的返回码.

一旦完成,仍然可以在Matlab中使用EX的返回代码.这将是调用Matlab脚本注意EX可能遇到的任何问题的最简单方法.另一方面,我希望Matlab在EX运行时执行其他操作,例如显示有关进度的信息.因此,呼叫需要是非阻塞的.

我尝试通过启动EX来解决这个明显的冲突,如上面第一个例子中所述.为了能够在EX忙时运行一些其他代码(显示进度信息),我将这段代码放入一个函数中,并使用一个带有小StartDelay的计时器调用它.

不幸的是,这并没有提供真正的多线程(如果没有Parallel Computing Toolbox,Matlab似乎无法实现),即如果计时器回调中的代码运行时间超过EX,则执行再次阻塞,直到计时器回调返回.更糟糕的是:由于我不知道EX会运行多长时间,因此定时器回调必须无休止地运行,直到它被停止或传递一些告诉它停止的标志.我尝试使用全局变量,甚至将此标志存储在应用程序数据中,如下所示:

setappdata(0, 'running', 1);

tim = timer(...
    'StartDelay', 2, ...
    'TimerFcn',   'while getappdata(0, ''running''), fprintf(''timer running ...\n''); pause(1); end' ...
);

fprintf('Starting timer.\n');
start(tim);

fprintf('Calling external program ...\n');
[s,r] = system('EX.exe');
fprintf('External program returned %d.\n', s); % <-- This is never reached.

setappdata(0, 'running', 0);

fprintf('Stopping timer.\n');
stop(tim);
delete(tim);
Run Code Online (Sandbox Code Playgroud)

调用system()之后的代码似乎永远不会被执行,并且定时器回调会永远运行...有没有其他方法可以让它工作或者它真的是系统的返回值还是非阻塞调用?

matlab

8
推荐指数
1
解决办法
5226
查看次数

将下标矢量化为矩阵转换

给定两个向量r和c,它们将行和列下标保存到矩阵A中(它的大小也给出),我想计算A.点可以多次出现,并且应该在每次出现时增加A中的相应元素.一个例子:

r = [1 2 4 3 2];
c = [2 2 1 1 2];
A = zeros(4, 3);

ind = sub2ind(size(A), r, c);
for i = 1 : length(ind)
    A(ind(i)) = A(ind(i)) + 1; % could as well use r and c instead of ind ...
end
Run Code Online (Sandbox Code Playgroud)

这产生了矩阵

A =
     0     1     0
     0     2     0
     1     0     0
     1     0     0
Run Code Online (Sandbox Code Playgroud)

如果可能的话,我想避免循环.是否存在针对此问题的矢量化解决方案?最好不会产生巨大的临时矩阵......

matlab

4
推荐指数
1
解决办法
277
查看次数

标签 统计

matlab ×2