2016-09-13 6 views
-1

Я запускаю CVX с разными параметрами параллельно. При работе в последовательной, я не получаю никаких предупреждений, но работает параллельно (с parfor), я получаю следующее:Выполнение CVX параллельно в Matlab

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. 

Я не видел это раньше, и я не знаю, как ее решить. Любая помощь приветствуется.

ответ

1

Предупреждение не о чем беспокоиться ... по крайней мере сразу. Помните, что это предупреждение, поэтому ваш код все равно должен работать. Это просто говорит вам, что функция 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

+0

Большое спасибо. Я отключил предупреждение. Но они все еще печатаются. Во всяком случае, я не хочу этого предупреждения. Мне просто интересно, как я могу найти remoteParallelFunction и внести некоторые изменения? – Erin

+0

@ Erin. Когда вы загружаете 'cvx', откройте папку, содержащую код, затем перейдите'/lib/@ cvx/bcompress.m'. Измените строку на строке 2 'error (nargchk (1, 3, nargin));' to 'error (narginchk (1, 3));'. Я обновлю свой пост. Оказывается, что 'remoteParallelFunction' не был виновником, но это вызвало вызов. – rayryeng

0

У меня была такая же проблема. Предупреждения не изменяют функциональность кода, но являются болью, если вы пытаетесь использовать окно команд для полезного вывода. Поскольку предупреждение было получено из огромного количества файлов 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