Я попытался предоставить функцию для 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, то N-ая строка в x
, для которой idx = 7, будет добавлена справа к N-ой строке в выводе анонимной функции, когда она применяется к x(x.idx==7,:)
.
Документация rowfun
не касается случаев, когда первый аргумент представляет функцию, которая возвращает многострочный вывод. На меня можно положиться только на наблюдаемое поведение. Было бы целесообразно использовать это поведение для упорядочения моего кода, или это плохая практика полагаться на такое недокументированное поведение, например, угловые случаи могут не охватываться, и TMW не обязана поддерживать текущее поведение в будущем?