'的语义是什么;结束';在Matlab中?
在Matlab中,通常使用'的语义是什么;结束';在Matlab中?,matlab,indexing,Matlab,Indexing,在Matlab中,通常使用end关键字作为访问或扩展数组的快捷方式,如 >> 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可能是一种特殊形式,如:,在索引操作中可以是特殊情况,因此我创建了一个类
end
关键字作为访问或扩展数组的快捷方式,如
>> 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
来自哪里?我的第一个猜测是,索引表达式x(end)
中的任何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
的语义吗?首先,我认为语法x(1:min(5,end))
完全起作用,这是一种缺陷,或者至少是一个意想不到的特性。当我在MathWorks时,我记得有人指出了这一点,相当多的开发人员不得不花一段时间来弄清楚到底发生了什么。我不确定他们是否真的同意这是否是个问题
为了解释end
的(预期)语义:end
作为函数ind=end(obj,k,n)
实现k
是包含end
的表达式的索引,n
是表达式中索引的总数
例如,当您调用a(1,end,1)
时,k
是2,因为end
在参数2中,而n
是3,因为有3个参数
ind
作为可以替换表达式中end
的索引返回
您可以为自己的类重载end
(与重载colon
、size
、subsref
等的方式相同)
要扩展您的示例,请执行以下操作:
classdef IndexDisplayer
methods
function ind = end(self,k,n)
disp(k)
disp(n)
ind = builtin('end', self, k, n);
end
end
end
>> a = IndexDisplayer;
>> a(1,end,1)
2
3
有关更多信息,请参阅。我也觉得这是一种好奇心。然而,我经常使用(利用?)这种行为来缩短语句。例如,在中,为了得到向量的
k
th元素以外的所有元素,我想到的一个干净的解决方案是
vector(setdiff(1:end,k))
此end
替换对numel(vector)
的调用。对于标量k
,这是向量(1:end~=k)
或向量([1:k-1k+1:end])
的替代方法。这在当时似乎是完全合理的,尽管我提请注意这种用法的奇怪之处。这真的是坏习惯吗?也许吧,但我已经接受了它的价值,并继续前进
我没有像山姆·罗伯茨(Sam Roberts)在他的回答中那样,提供任何关于这是如何工作的或规则是什么的见解,但从概念上讲,我认为这是一个上下文问题。也就是说,当出现end
时,我假设它的计算结果是具有最直接作用域的数组的索引(或维度下标),通过嵌套语句“查找”以进行确定。不确定这是否是正确的措辞,但这似乎是一个有用的方式来解释的操作
我还没有被这种解释所困扰。很有趣,谢谢。我假设对象的默认
end
只返回1
?我很想了解它在x(1:min(5,end))
的情况下是如何工作的。在找到定义了end
函数的对象之前,您是否一直沿着调用树走?我不确定x(1:min(5,end))
到底发生了什么,我也不确定您是否能够最终找到,除非您能够访问MATLAB的内部结构。对于我来说,当它位于这样的表达式中时,它如何选择要分派给哪个end
函数并不明显。例如,如果您将min
重新定义为数组,end
似乎是指数组min
的结尾,而不是x
的结尾,我无法解释原因。您可能需要询问MathWorks,尽管我不确定除了几个开发人员之外是否有人能给您提供完整的解释。如果您幸运的话,@Edric可能会听到这个batcall,并比我解释得更好…PS您还询问对象的默认end
是否只返回1。一个对象只是一个标量数组(大小为(1,1)),所以是的,当只调用一个对象时,它将返回1。但是如果对不同大小的对象数组调用,它将返回任何适当的值——除非您为该类重载了end
。文档中有一个类的示例,该类具有Data
属性,其中end
被重载以返回有关Data
的信息,而不是对象本身。在执行此操作时,您必须非常小心,以便在调用一组对象时获得正确的行为。Mathworks技术支持人员基本上确认,这是未记录的行为,不应依赖于此(特别是,它可能会在以后的MATLAB版本中消失或改变行为)。我会把这个标记暂时接受。我只是在这里闲逛。我只是想告诉你发帖后的3天(以防万一你错过了):这是官方未记录的行为。@AndrasDeak我确实看到了,谢谢。我应该说,我只会在交互式MATLAB命令提示符中使用这样的语句,而不是在编写您希望在将来使用的函数或脚本时使用。