Параллельный запуск CVX в Matlab
Я запускаю CVX с различными параметрами параллельно. При работе в последовательном режиме я не получаю никаких предупреждений, но, работая параллельно (с parfor), я получаю следующее:
In cvx/bcompress (line 2)
In cvxprob/newcnstr (line 233)
In cvxprob/newcnstr (line 72)
In == (line 3)
In cvx/abs (line 68)
In cvx/norm (line 56)
In remove_l (line 27)
In parallel_function>make_general_channel/channel_general (line 914)
In remoteParallelFunction (line 38)
Warning: NARGCHK will be removed in a future release. Use NARGINCHK or NARGOUTCHK instead.
Я не видел этого раньше, и я не знаю, как это решить. Любая помощь приветствуется.
2 ответа
Предупреждение не о чем беспокоиться... по крайней мере, немедленно. Помните, это предупреждение, поэтому ваш код все еще должен работать. Это просто говорит вам, что функция nargchk
устарела и что вы должны использовать более новые версии: narginchk
а также nargoutchk
вместо. Вы можете увидеть это предупреждение в официальной документации MathWorks для nargchk
здесь: http://www.mathworks.com/help/matlab/ref/nargchk.html. Я предполагаю, что последняя версия CVX была разработана до того, как MATLAB решила принять это решение.
Таким образом, все, что вам нужно сделать, это пойти в bcompress
файл в строке 2 и изменить nargchk
с narginchk
, В частности, при загрузке cvx
откройте папку, содержащую код, затем перейдите /lib/@cvx/bcompress.m
, Изменить строку в строке 2 error(nargchk(1, 3, nargin));
в error(narginchk(1, 3));
,
Если вы не собираетесь обновлять свою версию MATLAB и хотите использовать текущую версию, то вы можете просто проигнорировать предупреждение. Смотрите справочный файл MathWorks на narginchk
для получения более подробной информации: http://www.mathworks.com/help/matlab/ref/narginchk.html
У меня была такая же проблема. Предупреждения не изменяют функциональность кода, но вызывают боль, если вы пытаетесь использовать командное окно для полезного вывода. Поскольку предупреждение исходило от огромного количества файлов CVX, я написал скрипт, чтобы исправить их все.
Чтобы исправить все файлы CVX с помощью nargchk, скопируйте следующий код в файл с именем "update_nargchk.m" и либо запустите его в корневой папке cvx без аргументов, либо запустите его из другого места со строковым аргументом, указывающим на корневую папку cvx.
function update_nargchk(directory)
%UPDATE_NARGCHK Updates files using the depricated nargchk
% All files in the specified directory (or current directory if
% unspecified) are searched. If an instance of nargchk is found being
% used (with nargin) it is updated to use narginchk with the same values.
if ~exist('directory','var')
directory = '.';
end
recurse(directory);
end
function recurse( folder )
d = dir(folder);
for elem = 1:length(d)
if ~strcmp(d(elem).name,'.') && ~strcmp(d(elem).name,'..')
if d(elem).isdir
recurse([folder '/' d(elem).name]);
else
if strcmp(d(elem).name(end-1:end),'.m')
updateFile([folder '/' d(elem).name]);
end
end
end
end
end
function updateFile(filename)
% read file contents into workspace
fid = fopen(filename);
C=textscan(fid,'%s','delimiter','\n','whitespace','');
C = C{1,1};
fclose(fid);
% check for instances of nargchk
instanceFound = false;
for k=1:numel(C)
textline = C{k,1};
if ~isempty(regexp(textline,'^[^%]*nargchk','ONCE')) && ...
~isempty(regexp(textline,'^[^%]*nargin','ONCE'))
instanceFound = true;
nums = regexp(textline,'(\d+|-?Inf)','tokens');
nums = [str2double(nums{1}) str2double(nums{2})];
C(k) = {['narginchk(' num2str(nums(1)) ',' num2str(nums(2)) '); % Modified from: ' textline]};
end
end
if instanceFound
% print new file
fid = fopen(filename,'w'); % Open the file
for k=1:numel(C)
fprintf(fid,'%s\r\n',C{k,1});
end
fclose(fid);
disp([filename ' updated'])
end
end