Java 实矩阵与复矩阵相乘

Java 实矩阵与复矩阵相乘,java,eclipse,apache-commons,Java,Eclipse,Apache Commons,我对Java非常陌生,我面临着一个问题,我相信它很容易掌握 我正在生成一个与Apache-Commons数学库链接的项目 在项目中,我使用了相当多的RealMatrix对象。我有一个工作方法如下 public static RealMatrix DistCalc(RealMatrix YCoord, RealMatrix ZCoord){ RealMatrix Distance = new Array2DRowRealMatrix(YCoord.getRowDimension()

我对Java非常陌生,我面临着一个问题,我相信它很容易掌握

我正在生成一个与Apache-Commons数学库链接的项目

在项目中,我使用了相当多的
RealMatrix
对象。我有一个工作方法如下

public static RealMatrix DistCalc(RealMatrix YCoord, RealMatrix ZCoord){
        RealMatrix Distance = new Array2DRowRealMatrix(YCoord.getRowDimension(),ZCoord.getRowDimension());
        for(int ii = 0; ii < YCoord.getRowDimension(); ii++){
            for(int jj = 0; jj < ZCoord.getRowDimension(); jj++){
                Distance.setEntry(ii,jj,Math.sqrt((YCoord.getEntry(ii, 0) - YCoord.getEntry(jj, 0))*(YCoord.getEntry(ii, 0) - YCoord.getEntry(jj, 0)) + (ZCoord.getEntry(jj, 0) - ZCoord.getEntry(ii, 0))*(ZCoord.getEntry(jj, 0) - ZCoord.getEntry(ii, 0))));
            }
        }        
        return Distance;
    }
现在,我想将
RealMatrix
距离乘以
复数
矩阵nn\u:最后我应该得到一个
复数[N][nFFT]
矩阵


您介意解释一下吗?

我建议您基于
RealMatrix
接口创建自己的
ComplexMatrix
接口,然后基于
array2droraralMatrix
类创建自己的
Array2DRowComplexMatrix
类。要创建类,只需更改类名,将
double data[][]]
更改为
Complex data[]][]
,然后更新对
数据的所有引用

创建一个接受
RealMatrix
ComplexMatrix
构造函数,或者包含一个带有
RealMatrix
参数的
multiply
方法


Commons应该有您需要的所有方法,您可能只需要稍微调整一下它们的参数/返回类型。

如果我切换回Java primitive
double[][]
类型而不是
RealMatrix
,会更容易吗?我目前正在使用
RealMatrix
,因为代码结果更干净,我不必重新发明轮子。顺便说一句,我会尝试一下你的建议。这是你的要求,你真正需要的是一个乘法方法,它接受一个
Complex[][]
和一个
double[][][]
,它可以是一个
ComplexMatrix
类的实例方法,也可以是一个带有
(Complex[][]],double[]][])
参数的静态方法。无论哪种方式,下载数学源代码,并将
乘法
方法基于
Array2DRowComplexMatrix
类中的方法-该方法是您不希望自己重新实现的部分。
// Define the random phase for the u- component
    public static Complex[][] RandPhi(int N, int nFFT){
        Complex[][] nn_u = new Complex[N][nFFT];        
        for(int ii = 0; ii < N; ii++){
            for(int jj = 0; jj < nFFT; jj++){
                nn_u[ii][jj] = new Complex(Math.cos(new Random().nextDouble()*2*Math.PI),Math.sin(new Random().nextDouble()*2*Math.PI));
            }
        }
        return nn_u;
    }