2016-09-23 7 views
0

新しいテーブルを作成せずにテーブルを移動したかったのです。 MATLABには、rowfun APIがあります。しかし、戻り値のないラムダは好きではありません。そうするのが良いですか?新しいテーブルを作成しないでMATLABテーブルをトラバースする方法

>> 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] 
+2

達成しようとしている実際のユースケースは何ですか?何の説明もせずにコードを貼り付けることは、あなたがしようとしていることを理解しようとする人にとってはあまり役に立ちません。 – excaza

+0

@excaza多分displayは特別なAPIです。それは私に利用可能です。 >> (<...>/toolbox/matlab/lang/@ cell/display)%セルメソッドを表示します。私は配列のためにできることのようなテーブルを横断したがっていました。例えば、arrayfun(@(x)display( '')、table2array(T))は動作します。 –

+0

おっと、それを逃した – excaza

答えて

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: 
    '' 

    '' 

    '' 

短編小説長い

エラーがデフォルトで、少なくとも1つの出力を期待しているので、フォーマットのいくつかの種類(テーブル、セル、など)で出力を提供する必要が期待rowfunに基づいていますそれが使用している関数ハンドルからの引数です。

あなたはrowfunのソース(open rowfun)に関連する部分を見つけることができます:あなたが見ることができるように、出力のデフォルト数は1と、あなたがない限りです

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 

明示的な'NumOutputs', 0 NVペアのrowfunを呼び出すと、それは明らかにエラーを引き起こすdisplayからの出力を期待します。

関連する問題