MatLab重载`end`未按预期工作

s4n0splo  于 2022-11-15  发布在  Matlab
关注(0)|答案(1)|浏览(143)
classdef Array
    properties
        data = [1 2 3];
    end

    methods
        function ind = end(obj, k, n)
            ind = length(obj.data) - k;
        end
    end
end

A=Array(),如果我们做A(end)和断点到out = length...,我们会看到k=1,但docs

A(end-1)

A(ind)相同,其中

ind = end(A,1,1)

那么A(end)应该和end(A,0,1)相同?事实上,k=1还包括end-1end-9和其他任何类型。
就我覆盖subsref的目的而言,我只需设置ind = length(obj.data),它就可以工作,因此它看起来好像将end视为常量,例如,end - 1稍后被处理,但这似乎与文档相反。

wfypjpf4

wfypjpf41#

我同意这个功能的文档不是很清楚。
ind = end(A,k,n)
这些论点如下所述:
A是对象
k是使用end语法的表达式中的索引
n是表达式中的索引总数
ind是要在表达式中使用的索引值
他们的意思是,end出现在k索引中,n中。因此,在类似A(end-9)的索引表达式中,kn都是1,因为end出现在1个维度中的第一个维度中。对于A(end-1, end+1)end被调用两次,一次使用k=1, n=2,一次使用k=2, n=2。根据索引的维度数量,可以使索引操作以不同的方式工作。MatLab中最明显的用法是区分线性索引和多维索引,如果n=1,则end返回numel(A),而不管A实际有多少维。
无论使用end的计算有多复杂,它都应该始终返回给定维度上的元素数(或者更确切地说,返回最后一个元素的索引)。然后,MatLab将在计算中使用返回值。这实际上允许在索引表达式中进行涉及end的非常复杂的操作,例如A(min(5,end))
我对end操作符的不满之一是索引的类型没有区别,(){}。因此,如果您希望启用end,则不能让这两个索引操作符执行不同的操作。

相关问题