我正在使用不同参数并行运行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.
我以前没有见过这个,我不知道如何解决它。任何帮助表示赞赏。
答案 0 :(得分:1)
警告无需担心......至少立即。请记住,它是一个警告,因此您的代码仍应运行。它只是告诉您函数nargchk
已弃用,您应该使用较新的版本:narginchk
和nargoutchk
。您可以在此处nargchk
的MathWorks官方文档中看到此警告:http://www.mathworks.com/help/matlab/ref/nargchk.html。我的猜测是CVX开发的最后一个版本是在MATLAB决定做出这个决定之前。
因此,您所要做的就是进入第2行的bcompress
文件,然后使用nargchk
更改narginchk
。具体来说,当您下载cvx
时,请打开包含该代码的文件夹,然后转到/lib/@cvx/bcompress.m
。将第2行error(nargchk(1, 3, nargin));
的行更改为error(narginchk(1, 3));
。
如果您不打算升级您的MATLAB版本并且想要坚持使用当前版本,那么您可以忽略该警告。有关详细信息,请参阅narginchk
上的MathWorks帮助文件:http://www.mathworks.com/help/matlab/ref/narginchk.html
答案 1 :(得分:0)
我遇到了同样的问题。警告不会更改代码的功能,但如果您尝试使用命令窗口进行有用的输出,则会很麻烦。由于警告来自大量的CVX文件,我编写了一个脚本来修复它们。
要使用nargchk修复所有CVX文件,请将以下代码复制到名为“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