E 'comune usare la parola chiave end
come scorciatoia per accedere o estendere una matrice in Matlab, come inQuali sono le semantiche del 'fine' in Matlab?
>> x = [1,2,3];
>> x(1:end-1)
ans =
1 2
>> x(end+1) = 4
x =
1 2 3 4
Tuttavia, sono rimasto sorpreso di scoprire che il seguente funziona anche
>> x(1:min(5, end))
ans =
1 2 3 4
I ho pensato che end
potrebbe essere un modulo speciale, come :
, che può essere dotato di un involucro speciale nelle operazioni di indicizzazione, quindi ho creato una classe per rilevare questo
classdef IndexDisplayer
methods
function subsref(self, s)
disp(s);
end
end
end
Si può vedere come :
è speciale cased nel seguente esempio
>> a = IndexDisplayer;
>> a(1:3)
type: '()'
subs: {[1 2 3]}
>> a(:)
type: '()'
subs: {':'}
Tuttavia, quando ho indice con end
vedo solo
>> a(end)
type: '()'
subs: {[1]}
Qui il end
viene sostituito con un 1
. Da dove viene questo 1
? La mia prima risposta è stata che ogni end
all'interno di un'espressione di indicizzazione x(end)
sarebbe sostituita con una chiamata a length(x)
così ho provato l'override length
così
classdef IndexDisplayer
methods
function subsref(self, s)
disp(s);
end
function len = length(self)
len = 10;
end
end
end
tuttavia, che dà
>> a = IndexDisplayer;
>> length(a)
ans =
10
>> a(end)
type: '()'
subs: {[1]}
in modo che la teoria è fuori la finestra. Qualcuno può spiegare la semantica di end
?
Interessante, grazie. Suppongo che il valore predefinito 'end' per gli oggetti restituisca' 1'? Sarei interessato a scoprire come funziona nel caso di 'x (1: min (5, fine))'. Vai sull'albero delle chiamate finché non trovi un oggetto per cui è definita la funzione 'fine'? –
Non sono sicuro di cosa stia succedendo esattamente con 'x (1: min (5, fine))', e non sono sicuro di poterlo scoprire definitivamente a meno che tu non abbia accesso ai componenti interni di MATLAB. Non è ovvio per me come sceglie quale funzione 'end' inviare a quando è in un'espressione come quella. Ad esempio, se ridefinisci 'min' come array,' end' sembra riferirsi alla fine dell'array 'min', non alla fine di' x', e non so spiegarne il motivo. Potrebbe essere necessario chiedere a MathWorks, anche se non sono sicuro che nessuno, tranne un paio di sviluppatori, sarebbe in grado di darti una spiegazione completa. –
Se sei fortunato, @Edric potrebbe sentire questo batcall e spiegare le cose meglio di me ... –