我正在尝试构建自己版本的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/

10-10 23:53