具有多个输出的Matlab"rowfun"函数:假设行顺序是否安全



我尝试为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,则当idx=7应用于x(x.idx==7,:)时,x中idx=7的第N行将与匿名函数输出中的第N行将追加在右侧。

rowfun文档不处理第一个参数表示返回多行输出的函数的情况。我只有观察到的行为可以依赖。利用这种行为来简化我的代码是否明智,或者依赖这种未记录的行为是否是不良做法,例如,角落案件可能不包括在内,TMW没有义务在未来保持当前的行为?

如果您想留在文档区域,可以使用非常方便的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'})]

我想这会降低效率,但它将代码保持在函数的文档行为中,而不需要使用循环。

rowfun的文档在'GroupingVariables'下显示:

输出B为每组包含一行。

所以,如果你每组超过一排,你肯定是在非法水域。未来的版本可能会引发代码错误。

关于函数输入行的顺序:我建议您向MathWorks询问具有相同分组变量的行的顺序。一种方法是转到文档页面的底部,选择星级,然后在文本框中说文档不完整,因为它没有指定给定此选项时的行顺序。文档人员喜欢文档的彻底性和完整性,他们可以通过完成文档来回答这个问题。

相关内容

  • 没有找到相关文章

最新更新