如何在Java中构造一个可以处理真实的和复数的向量类?

afdcj2ne  于 2023-01-01  发布在  Java
关注(0)|答案(2)|浏览(99)

我一直在尝试用Java做一个线性代数库。我已经创建了一个向量类和复数类,Vector类已经有了处理实数的方法和操作(典型的doubleint)。Vector类以前有一个属性data [],它包含向量中数字的值。但是我现在添加了其他属性cData []isComplex-如果Vector使用不同的构造函数初始化,则isComplex将设置为true,并且cData包含Vector的复数值。我的目标是使该类尽可能与用户无缝连接,以便用户可以使用同一个类创建具有实数或复数值的Vector。
但是,由于Java的特性,我遇到了一些错误,特别是我的
. get()方法必须有两种不同的返回类型,这取决于isComplex是否为真,这是不可能的,因为我打算返回一个实值(double),如果Vector为实数和复数值(Complex)如果向量初始化为复数。有人有任何想法**吗关于我可以尝试什么或者我可以采取什么路线来更好地构造这个类?(属性/方法/等等)
目前为止我的想法是

  • 使两个不同的属性各包含数字的实部和虚部
  • 在使用. get()时遇到同样的问题
  • 具有data属性(双精度数组)、cData属性(复数数组)和isComplex布尔值,并根据具体情况以不同方式处理方法
  • 使用. get()时仍然遇到相同的问题
  • 使Vector类完全接受复数
  • 不确定这是否是用户的最佳情况

以下是我目前的方法和几种方法:

public class Vector {
   private double[] data;
   private Complex[] cData;
   private boolean isComplex = false;
   public final int length;

   public Vector(double[] vector) {
       this.data = vector;
       this.length = vector.length;
   }

   public Vector(String[] vector) throws ConstructFormatException {
       Complex[] array = new Complex[vector.length];
       for(int i = 0; i < vector.length; i++){
           array[i] = new Complex(vector[i]);
       }
       this.cData = array;
       this.isComplex = true;
       this.length = vector.length;
   }

   public void add(Vector vector) throws OperationUndefinedException{
       if(this.isComplex){
           //
       } else {
           MatrixOperation function = (d1, d2) -> {return d1 + d2;};
           applyOperation(vector, function);
       }
   }

   public double get(int index) throws OperationUndefinedException{
       if(index >= data.length){
           throw new OperationUndefinedException(INDEX_OUT_RANGE);
       }
       return data[index];
   }
}
mjqavswn

mjqavswn1#

通过您提供的代码片段,我猜您希望能够在运行中混合实值向量和复值向量。使用单个类实现这一点可能有点问题,因此我建议的解决方案是下一个。创建一个泛型interface Vector<T>,为这两个类创建函数,Vector<Double>Vector<Complex>,然后创建两个类,实现各自的功能,例如:class ComplexVector implements Vector<Complex>class RealVector implements Vector<Double>。在任何适用的地方抛出不支持的操作(就像一些java.util.List实现者所做的那样)。
这种方法将使您能够灵活地在vector接口中定义函数,无论是使用泛型"T"还是使用特定的double/Complex类型(只要您觉得合适)
编辑:你可以在接口中有一个bool isComplex()函数,并且两个子函数都将相应地实现,这将给你的实现带来自由。然而,你应该确保用户不会试图拥有他们自己的Vector接口实现,否则你的结构可能会失去它的"无缝性"。除此之外,用户将能够直接与您的两个子类进行交互,并且在它们之间进行交换而不会出现问题

pqwbnv8z

pqwbnv8z2#

我建议您看一看Apache Commons Numbers实现:GitHub您可以轻松地重用此库。
另一种方法是创建一个基本接口,例如MyNumber,它由Complex类和Real类实现,并使用其中一个。作为返回类型,您可以设置MyNumber,它可以处理这两个类。
或者可以使用与Apache相同的方法,其中真实的部和虚部都是double类型。
此外,在您的代码中有datacData,我建议您只使用complex类型的data,因为真实的是复数的子集,因此,每个实数都可以存储为虚部为0.0的复数。

相关问题