NMath是一个适用于所有.NET语言,如C#、Visual Basic、F#和.NET的数学库,它包含了.NET平台上的面向对象数字计算的基础类。我们将以连载的形式向大家介绍NMath的实用教程。本节内容展示向量的逻辑运算和算术运算。
向量的逻辑运算
Operator== 测试两个向量的相等性, 如果两个向量具有相同的维度且所有值相等,则返回 true ; 否则,返回false。遵循.NET Framework准则,如果两个对象都为null,则两个向量相等。
-
DoubleVector 和DoubleComplexVector的值的比较是使用operator == for double完成的。
-
FloatVector和 FloatComplexVector的值的比较是使用operator == for floats完成的。
-
向量的值必须完全相等才能使此方法返回 true。
注意:equals函数也需测试是否相等。NaNEquals忽略 Not-a-Number (NaN)的值。
向量的算术运算
对于支持向量的.NET语言,NMath提供带有常规意义的重载算术运算符,以及和那些不支持向量的语言等效的命名方法。下表列出等效的运算符:
算术运算符
操作符 | 等效命名 |
+ | Add() |
- | Subtract() |
* | Multiply() |
/ | Divide() |
Unary - | Negate() |
++ | Increment() |
-- | Decrement() |
注意:
-
Unary -,Increment()和Decrement()运算符应用于向量中的每个元素,Negate()返回一个新矢量对象,Increment() 和Decrement()不会。
-
所有二元运算符和等效命名方法都可以使用两个向量,或者使用向量和标量。
-
向量必须具有相同的长度才能使用 element-wise运算符进行组合。否则,抛出MismatchedSizeException。
例如:
Code Example – C# vector
var v = new FloatVector(5,0,1); // [0,1,2,3,4] var u = new FloatVector(5,1,1); // [1,2,3,4,5] float scalar = 2;FloatVector w = v + scalar*u;
此Visual Basic代码使用等效的命名方法:
Code Example – VB vector
Dim V As New FloatVector(5, 0, 1) Dim U As New FloatVector(5, 1, 1) Dim Scalar As Single = 2 Dim W As FloatVector = FloatVector.Add(V, FloatVector.Multiply(Scalar, U))
NMath还提供接受三个向量参数算术命名方法的重载。第三个向量保存对前两个向量合理操作的结果,因为不会分配新内存,所以效率更高,这对于重复操作很有用。当添加两个向量并将结果存储在第三个中时:
Code Example – C# vector
var v = new DoubleVector( "[ 0 1 2 3 4 ]" ); var u = new DoubleVector( 5, 1 ); var w = new DoubleVector( u.Length );DoubleVector.Add( v, u, w );DoubleVector.Add( v, u++, w );DoubleVector.Add( v, v, w ); // Still only three vectors allocated
Code Example – VB vector
Dim V As New DoubleVector("[ 0 1 2 3 4 ]") Dim U As New DoubleVector(5, 1) Dim W As New DoubleVector(U.Length)DoubleVector.Add(V, U, W)DoubleVector.Add(V, U.Increment(), W)DoubleVector.Add(V, V, W) ' Still only three vectors allocated
如果三个向量的长度不同,则抛出MismatchedSizeException,第三个向量参数也可以与前两个参数中的一个相同,在这种情况下,它会被结果覆盖:
Code Example – C# vector
DoubleVector.Subtract( u, v, v );
Code Example – VB vector
DoubleVector.Subtract(U, V, V)