如何在没有创建新表的情况下遍历MATLAB表

时间:2016-09-23 18:52:26

标签: matlab

我想在没有创建新桌子的情况下旅行。 MATLAB有一个rowfun API。但它不喜欢没有返回类型的lambda。还有更好的事情吗?

>> T = table({1;2;3})

T = 

Var1
____

[1] 
[2] 
[3] 

>> rowfun(@(x) display('') , T)
Error using table/rowfun>dfltErrHandler (line 338)
Applying the function '@(x)display('')' to the 1st row of A generated the following error:

Too many output arguments.


Error in      table/rowfun>@(s,varargin)dfltErrHandler(grouped,funName,s,varargin{:}) (line 200)
errHandler = @(s,varargin) dfltErrHandler(grouped,funName,s,varargin{:});

Error in table/rowfun (line 219)
            [b_data{i,:}] = errHandler(struct('identifier',ME.identifier, 'message',ME.message,
            'index',i),inArgs{:});

>> rowfun(@(x) x , T)

ans = 

Var1
____

[1] 
[2] 
[3] 

1 个答案:

答案 0 :(得分:3)

短篇小说

如果您不希望显式输出,请使用以下语法来调用rowfun

rowfun(@(x) display(''), T, 'NumOutputs', 0)

给出以下示例:

T = table({1;2;3});

fprintf('rowfun:\n')
rowfun(@(x) display(''), T, 'NumOutputs', 0, 'OutputFormat', 'uniform');
fprintf('arrayfun:\n')
arrayfun(@(x) display(''), table2array(T))

我们获得了一致的回报:

>> testcode
rowfun:
     ''

     ''

     ''

arrayfun:
     ''

     ''

     ''

短篇小说

错误基于rowfun期望必须以某种格式(表格,单元格等)提供输出,因此它的默认值是期望来自函数的至少一个输出参数处理它& #39;正在使用。

您可以在rowfun的来源(open rowfun)中找到相关部分:

pnames = {'GroupingVariables' 'InputVariables' 'OutputFormat' 'NumOutputs' 'OutputVariableNames' 'SeparateInputs' 'ExtractCellContents'  'ErrorHandler'};
dflts =  {                []               []              2            1                    {}             true                 false              [] };
[groupVars,dataVars,outputFormat,nout,outNames,separateArgs,extractCells,errHandler,supplied] ...
    = matlab.internal.table.parseArgs(pnames, dflts, varargin{:});

try
    if nout > 0
        [b_data{i,:}] = fun(inArgs{:});
    else
        fun(inArgs{:});
    end
catch ME
    if nout > 0
        [b_data{i,:}] = errHandler(struct('identifier',ME.identifier, 'message',ME.message, 'index',i),inArgs{:});
    else
        errHandler(struct('identifier',ME.identifier, 'message',ME.message, 'index',i),inArgs{:});
    end
end

正如您所看到的,默认输出数量为1,除非您使用明确的rowfun NV对调用'NumOutputs', 0,否则它会产生输出来自display,这显然会导致错误。