34.3.1定义索引和索引赋值

对象可以用括号或大括号进行索引,如obj(idx)或类似obj{idx},甚至类似obj(idx).field然而,这取决于程序员来决定这个索引的实际含义。在多项式类的情况下</p>(n)可能意味着的系数n-多项式的次幂,或者它可能是多项式的求值n。此下标引用的含义从subsref方法

 
: newval = subsref (val, idx)

对执行下标元素选择操作val根据指定的下标idx.

下标idx必须是具有字段的结构体数组类型潜艇’. 的有效值类型(),{}.这个潜艇字段可以是:或者索引值的元胞数组。

以下示例显示如何提取矩阵的前两列

val=魔术(3)⇒ val=[8 1 6 3 5 7 4 9 2]idx.type=“()”;idx.subs={“:”,1:2};subsref(val,idx)⇒ [ 8   1          3   5          4   9 ]

请注意,这与书写相同val(:,1:2).

如果idx是一个带有字段的空结构体数组类型潜艇returnval.

关键字终止不能在中使用subsref用于索引赋值。

详见: 潜艇, 子结构体.

例如,此类使用的约定是()多项式求值并使用进行索引{}返回n-th系数(的n-th次幂)。的代码subsref方法看起来像

函数r=subsref(p,s)if(isempty(s))error(“@多项式/subsref:缺少索引”);endif开关(s(1).type)case“()”idx=s(1个).subs;if(numel(idx)!=1) error(“@多项式/subsref:只需要一个索引”);endif r=聚乙烯(fliplr(p.poly),idx{1});case“{}”idx=s(1).subs;if(numel(idx)!=1) error(“@多项式/subsref:只需要一个索引”);endif if(isnumeric(idx{1}))r=p.poly(idx{1}+1);否则r=p.poly(idx{1});endif case“.”fld=s.subs;if(!strcmp(fld,“poly”))error('@多项式/subsref:无效属性“%s”',fld);endif r=p.poly;否则错误(“@多项式/subsref:无效的下标类型”);endswitch if(numel(s)>1)r=subsref(r,s(2:end));endifend函数

下标赋值的等效函数使用subs方法

 
: newval = subsasgn (val, idx, rhs)

根据指定的下标执行下标赋值操作idx.

下标idx必须是具有字段的结构体数组类型潜艇’. 的有效值类型(),{}.这个潜艇字段可以是:或者索引值的元胞数组。

以下示例显示如何将3乘3矩阵的前两列设置为零。

val=魔术(3);idx.type=“()”;idx.subs={“:”,1:2};val=subsasgn(val,idx,0)⇒  [ 0   0   6           0   0   7           0   0   2 ]

请注意,这与书写相同val(:,1:2)=0.

如果idx是一个带有字段的空结构体数组类型潜艇returnrhs.

关键字终止不能在中使用subs用于索引赋值。

详见: subsref, 子结构体, 优化subsasgn_calls.

 
: val = optimize_subsasgn_calls ()
: old_val = optimize_subsasgn_calls (new_val)
: old_val = optimize_subsasgn_calls (new_val, "local")

查询或设置的内部标志subs方法胼胝化。

如果为true,Octave将在调用时尝试消除冗余复制subs方法。

当从具有的函数内部调用时地方的参数,则该变量会为函数及其调用的任何子程序在本地进行更改。退出函数时将恢复原始变量值。

详见: 潜艇.

请注意subsrefsubs方法总是接收整个索引链,而它们通常只处理第一个元素。这些方法负责处理链的其余部分(如果需要),通常通过将其再次转发到subsrefsubs.

如果您希望使用终止关键字在另一个对象的下标表达式中,则必须有终止方法定义。例如终止多项式类的方法可能看起来像

函数r=end(obj,index_pos,num_indices)if(num_indics!=1)error(“多项式对象只能有一个索引”);endif r=长度(obj.poly)-1;结束函数

这是一个相当通用的终止具有类似于的行为的方法终止Octave Array类的关键字。使用多项式类的一个例子是

p=多项式([1,2,3,4]);p{端1}⇒ 3.

对象本身也可以用作下标表达式中的索引,这从子索引作用

 
: idx = subsindex (obj)

将对象转换为索引向量。

什么时候obj是用类构造函数定义的类对象,则子索引是重载方法,它允许将此类对象转换为有效的索引向量。需要注意的是子索引必须返回类的从零开始的实整数向量double。例如,如果类构造函数是

函数obj=myclass(a)obj=class(struct(“a”,a),“myclass”);结束函数

然后子索引作用

函数idx=子索引(obj)idx=双(obj.a)-1.0;结束函数

可以如下使用

a=myclass(1:4);b=1:10;b(a)⇒ 1  2  3  4

详见: , subsref, 潜艇.

最后,通过提供冒号方法

 
: r = colon (base, limit)
: r = colon (base, increment, limit)

返回对应于的冒号表达式的结果基础,限度,并且可选地,定期的加薪.

此函数等效于运算符语法基础: 限度基础: 定期的加薪: 限度.

详见: linspace.


版权所有 © 2024 Octave中文网

ICP备案/许可证号:黑ICP备2024030411号