【译】Jep文档(4)——数据类型(Data Type)

数据类型


在标准模式中,Jep支持许多不同的数据类型,包括数字、字符串、向量(数组)和复数。数字在默认情况下由double类型表示。当然,也可以像自定义类型描述的那样,改变内置表示。

字符串(String)

可以通过使用双引号可以引入字符串,并且可以用“+”操作符将两个字符串串联起来,用关系运算符==或!=比较两个字符串。一个涉及到字符串类型的简单表达式”foo” + “bar” == “foobar”,用Jep运算后结果为true。

addVariable(String name, Object value)方法来添加一个字符串变量。如果表达式的结果是一个字符串,就可以通过调用evaluate()方法来获取它。


向量(Vectors)

向量是一个值列表,值之间用逗号隔开,并且用方括号将所有值括起来。您可以使用方括号来访问向量的元素。例如,用v[2]来获取向量v的第二个元素。

下面列出了一些涉及向量的示例表达式:

a = [2, 3, 10]      // create a variable with a vector value
a[1]                // evaluates as 2
a[3]                // evaluates as 10

a + [1, 2, 3]       // addition, evaluates as [3, 5, 13]
a - [1, 2, 3]       // subtraction, evaluates as [1, 1, 7]
[3, 4, 5]*2         // multiplication by a scalar,
                    // evaluates as [6, 8, 10]
[1,2] * [1,2]       // interpreted as a column vector times a row
                     // vector. Evaluates as [[1.0, 2.0], [2.0, 4.0]]
[4, 6, 8]/2         // division by a scalar, evaluates as [2, 3, 4]
[1,2,3].[1,2,3]     // dot product, evaluates as 14
[1,2,3]^^[1,2,3]    // cross product, evaluates as [0, 0, 0]
min([6,4,7,8])      // minimum value, 4
max([6,4,7,8])      // minimum value, 8
avg([6,4,7,8])      // average value, 2.5
vsum([6,4,7,8])     // sum of elements, 25

在后台,向量值表示成列表,特别是Vector<Object>。使用addVariable(String name, Object value)方法来添加向量(vector)变量。值参数应该是Vector类型。如果表达式的结果是一个向量,可以通过调用evaluate()方法来获得。

向量值变量的使用方法如下:

// Add the variable y with value [1.2,3.4]
jep.addVariable("y", new Vector<Object>(Arrays.asList(new Double[]{1.2,3.4})));
// Use the y[2] syntax to get a specific element
Object res = jep.evaluate(jep.parse("y[2]"));
assertEquals(3.4,res);
// calculate the vector expression y*2 
Object res2 = jep.evaluate(jep.parse("y*2"));
// The returned type will be Vector<Object>
assertTrue(res2 instanceof Vector<?>);
Vector<Object> vec = (Vector<Object>) res2;
// Convert to an array
Object[] array = vec.toArray();
assertArrayEquals(new Object[]{2.4,6.8},array);

这对于矩阵的支持是非常有限的。矩阵可以指定为嵌套的向量,如:[[1.0, 2.0], [2.0, 4.0]]。向量相乘可以得到矩阵,但矩阵乘以向量挥着矩阵相乘不能得到合理的结果。min,max,avg和vsum函数像向量一样工作,把所有的元素都折叠成一个一维数组。


复数

Jep在大多数操作和函数中支持复数。虚部 i 是标准变量表中的一部分,在使用StandardComponents时,被加入到解释器中。还包括了一组复函数,re(c),im(c),cmond(c),conj(c),complex(x, y)和polar(r, hteta)。查看Functions了解更多。需要导入com.singularsys.jep.standard.Complex类才能过操作表达式中的复数值。

通过使用虚数常数 i ,就可以在表达式中处理复数了。一些简单的复数表达式列举如下:

(1+2*i)^3
e^(-i)
re((1+2*i)^2 - (3+3*i)^2)

要从表达式中获取一个复数值,不许使用evaluate()方法,该方法会求解表达式并将结果作为复数对象返回。但是,你需要手动地将返回地的对象转换城复数类型。

在求解表达式之前可以使用addVariable(String name, double re, double im)来完成向解释器中添加复变量或常数。这个方法有三个参数:变量名(String),实部(double)和虚部(double)。


自定义类型

在多数情况下,只需要使用到Jep提供的少数几种类型(Double,Complex,Vector,String)。但假设你想要求解一个设及其他类型的表达式,你可能想让变量拥有自定义类型或用自定义类型创建数字。

你可以通过addVariable(String name, Object value)方法创建自定义类型的变量。

您可以通过设置数字工厂来确认数字是通过特殊类型创建的。例如,bigdecimal组建能够创建比double类型更精确的数字。简单实现NumberFactory接口及其createNumber(String)方法,并且调用setComponent(JepComponent)来加载你的数字工厂类到Jep中。

表达式在求解时,值会与函数包中的类一起操作,这包括操作(如AddSubtract)和函数(如SineCosine)。在不修改源代码的情况下,只有默认的类型是用这些类来处理的。所以,为了能够处理自定义的类型,需要修改这些类,或者按照自定义功能部分中描述的那样制作自己的函数类。请查看 custom functions section获取更多信息。


阅读更多
个人分类: java
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭