2016-09-13 2 views
-1

Ich laufe CVX mit verschiedenen Parametern parallel. Wenn in Serie geschaltet ist, ich habe keine Warnung erhalten, aber parallel (mit parfor) ausgeführt wird, erhalte ich folgende:CVX parallel in Matlab laufen

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. 

Ich habe nicht gesehen, und ich weiß nicht, wie es zu lösen. Jede Hilfe wird geschätzt.

Antwort

1

Die Warnung ist nichts, worüber man sich sorgen muss ... zumindest sofort. Denken Sie daran, es ist eine Warnung, damit Ihr Code weiterhin ausgeführt werden sollte. Es teilt Ihnen einfach mit, dass die Funktion nargchk veraltet ist und dass Sie stattdessen die neueren Versionen verwenden sollten: narginchk und nargoutchk. Sie können diese Warnung in der offiziellen Dokumentation von The MathWorks unter nargchk hier sehen: http://www.mathworks.com/help/matlab/ref/nargchk.html. Meine Vermutung ist, dass die letzte Version von CVX entwickelt wurde, bevor MATLAB diese Entscheidung traf.

Als solche alles, was Sie tun müssen, gehen Sie in die bcompress Datei in Zeile 2 und ändern nargchk mit narginchk. Öffnen Sie speziell den Ordner, der den Code enthält, wenn Sie cvx downloaden, gehen Sie dann /lib/@cvx/bcompress.m. Ändern Sie die Linie in Zeile 2 error(nargchk(1, 3, nargin)); zu error(narginchk(1, 3));.

Wenn Sie nicht beabsichtigen, Ihre Version von MATLAB zu aktualisieren, und Sie bei der aktuellen Version bleiben möchten, können Sie die Warnung einfach ignorieren. Weitere Informationen finden Sie in der MathWorks-Hilfedatei unter narginchk: http://www.mathworks.com/help/matlab/ref/narginchk.html

+0

Vielen Dank. Ich habe die Warnung ausgeschaltet. Aber diese sind immer noch gedruckt. Jedenfalls möchte ich diese Warnung überhaupt nicht. Ich frage mich nur, wie kann ich remoteParallelFunction finden und einige Änderungen vornehmen? – Erin

+0

@Erin - Wenn Sie 'cvx' herunterladen, öffnen Sie den Ordner, der den Code enthält, und gehen Sie dann zu'/lib/@ cvx/bcompress.m'. Ändere die Zeile in Zeile 2 'error (nargchk (1, 3, nargin));' in 'error (narginchk (1, 3));'. Ich werde meinen Beitrag aktualisieren. Stellt sich heraus, dass "remoteParallelFunction" nicht der Schuldige war, aber das ist, wo der Anruf stammt. – rayryeng

0

Ich hatte das gleiche Problem. Die Warnungen ändern die Funktionalität des Codes nicht, sind jedoch ein Problem, wenn Sie versuchen, das Befehlsfenster für nützliche Ausgaben zu verwenden. Da die Warnung von einer großen Anzahl von CVX-Dateien kam, schrieb ich ein Skript, um alle zu beheben. Um alle CVX-Dateien mit nargchk zu reparieren, kopiere den folgenden Code in eine Datei mit dem Namen 'update_nargchk.m' und führe ihn entweder ohne Argumente im cvx root-Ordner aus oder führe ihn von woanders aus mit einem string-Argument auf dein cvx-root Mappe.

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