簡體   English   中英

具有多個輸出的 Matlab `rowfun` 函數:假設行順序安全嗎?

[英]Matlab `rowfun` function with multiple outputs: Safe to assume row order?

我嘗試為rowfun提供一個函數,該函數返回與輸入高度相同的多行輸出。 似乎按預期工作。

% Example table with 2-column-array as a single data field
x = table( [1;1;2;2] , [[2;2;1;1] [2;1;2;1]] , ...
           'VariableNames' , {'idx' 'Field2columns'} )

  x = idx    Field2columns
      ___    _____________
      1      2    2       
      1      2    1       
      2      1    2       
      2      1    1       

% Example anonymous function takes all rows with same idx value and
% reverse their row order
y = rowfun( @(z) z(end:-1:1,:) , x , 'Input','Field2columns' , ...
            'Grouping','idx' , 'OutputVar','OutVar' )

  y =        idx    GroupCount    OutVar
             ___    __________    ______
      1      1      2             2    1
      1_1    1      2             2    2
      2      2      2             1    1
      2_1    2      2             1    2

% Append the generated data to original table
[ x y(:,{'OutVar'}) ]

  ans =      idx    Field2columns    OutVar
             ___    _____________    ______
      1      1      2    2           2    1
      1_1    1      2    1           2    2
      2      2      1    2           1    1
      2_1    2      1    1           1    2

這使得代碼非常高效。 否則,我將不得不遍歷x.idx所有不同值,為每個值提取x匹配行,生成行反轉子集並編譯結果。

我唯一擔心的是,我假設匿名函數輸出的行順序將保持不變,並且每一行都將與表x的相應行對齊。 例如,如果 idx=7,那么當它應用於x(x.idx==7,:)時, x中 idx=7 的第 N 行將附加到匿名函數輸出中的第 N 行。

rowfun文檔不處理第一個參數表示返回多行輸出的函數的情況。 我只有觀察到的行為可以依賴。 利用這種行為來簡化我的代碼是可取的,還是依賴這種未記錄的行為是一種不好的做法,例如,可能不包括極端情況,並且 TMW 沒有義務在未來保持當前行為?

'GroupingVariables''GroupingVariables' rowfun 文檔說:

輸出 B 包含每一組的一行。

因此,如果您每組獲得不止一排,那么您肯定是在無證水域。 未來的版本可能會在您的代碼中引發錯誤。

關於函數輸入行的順序:我建議您向 MathWorks 詢問具有相同分組變量的行的順序。 一種方法是轉到文檔頁面的底部,選擇星級,然后在文本框中說文檔不完整,因為在給出此選項時它沒有指定行的順序。 喜歡文檔的人喜歡徹底和完整的文檔,他們可能會通過完成文檔來回答這個問題。

如果你想留在記錄區域,你可以使用非常方便的splitapply 要處理輸出中的多行,您可以將它們放在一個單元格中,然后將其轉換為表格:

y = splitapply(@(z) {z(end:-1:1,:)},x.Field2columns,x.idx) % note the {...} in the function
[x table(cell2mat(y),'VariableNames',{'OutVar'})] % this is like: [x y(:,{'OutVar'})]

我猜這會降低效率,但它使您的代碼保持在函數的記錄行為內,而無需使用循環。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM