Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
'的语义是什么;结束';在Matlab中?_Matlab_Indexing - Fatal编程技术网

'的语义是什么;结束';在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可能是一种特殊形式,如:,在索引操作中可以是特殊情况,因此我创建了一个类

在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
可能是一种特殊形式,如
,在索引操作中可以是特殊情况,因此我创建了一个类来检测这种情况

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命令提示符中使用这样的语句,而不是在编写您希望在将来使用的函数或脚本时使用。