我正在尝试构建自己版本的MATLABdir
函数我当前的代码(如下)几乎可以工作,但我在解析某个输入组合时遇到问题。
我希望它这样做:
不要列出隐藏的文件夹。
使用布尔参数(默认值为false)只返回目录名而不返回文件。
为文件夹的路径提供一个可选字段(默认为当前目录)。
为了更清楚,我想创建一个函数dir2
,它可以处理这些组合:dir2
这应该列出当前目录中所有未隐藏的文件或文件夹dir2('path_to_directory')
这应该列出指定目录中所有未隐藏的文件或文件夹dir2('OnlyDirectories', true)
这应该只列出当前目录中未隐藏的文件夹dir2('path_to_directory', 'OnlyDirectories', true)
这应该只列出指定目录中未隐藏的文件夹
我现在的版本是:
function list = dir2(varargin)
p = inputParser;
addOptional(p, 'name', '.', @ischar);
addParameter(p, 'OnlyDirectories', false, @islogical);
parse(p, varargin{:});
list = dir(p.Results.name);
if p.Results.OnlyDirectories
dirFlags = [list.isdir];
list = list(dirFlags); % Keeping only directories
end
% Deleting hidden folders from the list
list = list(arrayfun(@(x) ~strcmp(x.name(1),'.'), list));
end
这对案例1、2和4都很有效,但对案例3不起作用在这种情况下,它给了我一个错误:
参数名应为字符串标量或字符向量,而输入类型为“逻辑”。
我想我可能遗漏了一些关于MATLAB输入解析的琐碎内容,但是我不知道是什么。
最佳答案
你说得对,解析器似乎给出了一些奇怪的结果,一个相关的问题可能是this one。
一种解决方法是,如果给定两个输入,则添加一个检查,该方法适用于当前形式的函数如果有两个输入,假设它是您的OnlyDirectories
标志,并使用默认的name
值代码将如下所示,并传递所有4个示例用例。
function list = dir2(varargin)
p = inputParser;
addOptional(p, 'name', '.', @ischar);
addParameter(p, 'OnlyDirectories', false, @islogical);
if numel(varargin) == 2
varargin = [{'.'}, varargin];
end
parse(p, varargin{:});
list = dir(p.Results.name);
if p.Results.OnlyDirectories
dirFlags = [list.isdir];
list = list(dirFlags);
end
list = list(arrayfun(@(x) ~strcmp(x.name(1),'.'), list));
end
不过,这有点老生常谈,而且有可能给出令人困惑的错误消息最好将两个输入都作为名称-值对
function list = dir2(varargin)
p = inputParser;
addParameter(p, 'name', '.', @ischar);
addParameter(p, 'OnlyDirectories', false, @islogical);
% ... other code
end
使用:
dir2('name', 'C:/Folder/MyStuff/', 'OnlyDirectories', true)
关于matlab - 仅提供名称/值对时,带有“varargin”的函数给出错误:MATLAB,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45670058/