Общепринято использовать ключевое слово end как ярлык для доступа или расширения массива в Matlab, как в
>> x = [1,2,3];
>> x(1:end-1)
ans =
1 2
>> x(end+1) = 4
x =
1 2 3 4
Однако я с удивлением обнаружил, что также работает
>> x(1:min(5, end))
ans =
1 2 3 4
Я думал, что end может быть специальной формой, например :, которая может быть специально обрезана в операциях индексирования, поэтому я создал класс для обнаружения этого
classdef IndexDisplayer
methods
function subsref(self, s)
disp(s);
end
end
end
Вы можете видеть, как : используется в следующем примере
>> a = IndexDisplayer;
>> a(1:3)
type: '()'
subs: {[1 2 3]}
>> a(:)
type: '()'
subs: {':'}
Однако, когда я индексирую с end, я просто вижу
>> a(end)
type: '()'
subs: {[1]}
Здесь end заменяется на 1. Откуда этот 1? Мое первое предположение заключалось в том, что любой end внутри выражения индексирования x(end) будет заменен вызовом на length(x), поэтому я попытался переопределить length, а также
classdef IndexDisplayer
methods
function subsref(self, s)
disp(s);
end
function len = length(self)
len = 10;
end
end
end
Однако это дает
>> a = IndexDisplayer;
>> length(a)
ans =
10
>> a(end)
type: '()'
subs: {[1]}
так что теория выходит из окна. Может ли кто-нибудь объяснить семантику end?