Używam funkcji cellfun
do zastosowania funkcji do każdej komórki w tablicy komórek.Czy owijanie funkcji operatorem {} jest poprawnym zamiennikiem 'UniformOutput', false w cellfun?
Wiem, że muszę ustawić 'UniformOutput'
na false
, gdy funkcja zwraca wartości nie-skalarne, tak że wyjścia funkcji są zwracane hermetyzowane w tablicy komórek.
Take następującą tablicę komórek jako przykład:
C1 = {[1 2 3], [4 5 6]};
C1
ma dwie komórki, a każda komórka zawiera wektor z trzech elementów:
C1 =
1×2 cell array
[1×3 double] [1×3 double]
Jeśli chcę dodać 1
do treści w każdej komórce mogę zdefiniować funkcję @(x) x + 1
i zastosować ją w następujący sposób:
C2 = cellfun(@(x) x + 1, C1, 'UniformOutput', false);
Działa to bardzo dobrze, ale zauważ, że muszę się upewnić, że 'UniformOutput'
jest ustawione na false
, jak już wcześniej wyjaśniłem, w przeciwnym razie zostanie zgłoszony błąd.
Jednak po przeczytaniu this thread, zdałem sobie sprawę, że jeśli będę owijać funkcji z cell array construction operator {}
jak ta @(x) {x + 1}
potem nie trzeba ustawić 'UniformOutput'
do false
.
więc następujące polecenie generuje takie same wyniki jak w C2
bez rzuca wszelkie błędy:
C3 = cellfun(@(x) {x + 1}, C1);
chodzi o układ kodu wolę takie podejście, ponieważ jest bardziej zwarty i mniej gadatliwy niż poprzednio, ale Nie jestem pewien, czy to zawsze jest bezpieczne.
Tak więc moje pytanie brzmi:
zawsze mogę zawinąć funkcję z {}
uniknąć ustawiania 'UniformOutput'
do false
? Czy są jakieś scenariusze, w których takie zastąpienie nie zadziałałoby?
Moje badania:
help cellfun
'UniformOutput'
- wartość logiczną wskazującą, czy wyjście (s) zFUN
może być zwrócony bez hermetyzacji w komórce tablicy. Jeślitrue
(domyślnie),FUN
musi zwracać wartości skalarne, które mogą być łączone w macierz. Jeślitrue
, wyjścia muszą być następujące typy: numeryczne, logiczne, char, struct, komórka. Jeślifalse
, ,cellfun
zwraca tablicę komórek (lub wiele macierzy komórek), , gdzie komórka (I, J, ...) th zawiera wartość FUN (C {I, J, ...}, ...) . Gdy'UniformOutput'
tofalse
, wyjścia mogą być dowolnego typu.
Poniższy fragment jest częścią an answer powiązanemu pytanie:
[...]
cellfun
dba operacji dereference która obowiązek zrobić szczegółowe operacji na poszczególnych elementach komórce kiedy pętli (czyli{}
) [...]
Wow..Nie wiedziałem, że przechwytywanie wielu wyjść z 'cellfun' było nawet możliwe. To jest pouczająca odpowiedź! Dziękuję Ci :) – codeaviator