Общепринято использовать ключевое слово 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
?