Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用Java实现两个矩阵的相乘_Java_R_Matrix_Jama - Fatal编程技术网

用Java实现两个矩阵的相乘

用Java实现两个矩阵的相乘,java,r,matrix,jama,Java,R,Matrix,Jama,我试着将两个矩阵相乘。 我尝试使用R软件:检查此线程: 现在我尝试用Java做同样的事情 我使用Jama库来创建矩阵 我的幂函数 public Matrix power(Matrix M, double p) { EigenvalueDecomposition evd = M.eig(); Matrix D = evd.getD(); for (int i = 0; i < D.getColumnDimension(); i++) { D.set(i

我试着将两个矩阵相乘。 我尝试使用R软件:检查此线程:

现在我尝试用Java做同样的事情

我使用Jama库来创建矩阵

我的幂函数

public Matrix power(Matrix M, double p) {
    EigenvalueDecomposition evd = M.eig();
    Matrix D = evd.getD();
    for (int i = 0; i < D.getColumnDimension(); i++) {
        D.set(i, i, Math.pow(D.get(i, i), p));
    }

    Matrix V = evd.getV();

    return V.times(D.times(V.transpose()));
}


double[][] matDouble1 = {{0.25, 0.25, 0.25, 0.25}};
double[][] matDouble2 = {{0, 0, 1, 0},
                       {0.333, 0, 0.333, 0.333},
                       {1, 0, 0, 0},
                       {0, 1, 0, 0}};
Matrix mat1 = new Matrix(matDouble1);
Matrix mat2 = new Matrix(matDouble2);
mat2 = power(mat2, 10000);
mat1 = mat1.times(mat2.transpose());
而不是

0.5 0 0.5 0
有了R我就知道了

mpower = function(M,p) {
     A = as.matrix(M)

    if (dim(A)[1] != dim(A)[2]) stop("not a square matrix")

    # M^{-1} = the matrix inverse of M
    if (p==-1) return(solve(A))

    # M^0 = I
    if (p==0) return(diag(1,dim(A)[1],dim(A)[2]))

    # M^1 = M
    if (p==1) return(A)

    if (p < -1) stop("only powers >= -1 allowed")
    if (p != as.integer(p)) stop("only integer powers allowed")

    R = A
    for (i in 2:p) {
        R = R %*% A
    }
    return(R)

在MATLAB中做了如下操作:

>> a = [0.25, 0.25, 0.25, 0.25]

a =

    0.2500    0.2500    0.2500    0.2500

>> b= [0 0 1 0; .333 0 .333 .333; 1 0 0 0; 0 1 0 0]

b =

         0         0    1.0000         0
    0.3330         0    0.3330    0.3330
    1.0000         0         0         0
         0    1.0000         0         0

>> c = b^10000

c =

    1.0000         0         0         0
    0.4993         0    0.4993         0
         0         0    1.0000         0
    0.4993         0    0.4993         0

>> a*c'

ans =

    0.2500    0.2496    0.2500    0.2496
Java代码工作正常。然而:

>> a*c

ans =

    0.4996         0    0.4996         0
因此,矩阵在R代码中被转置,因为在
as.matrix
语句中需要
byrow=TRUE

澄清:

mat2<-matrix(c(0,0,1,0,0.3,0,0.3,0.3,1,0,0,0,0,1,0,0),nrow=4)
你想要

mat2<-matrix(c(0,0,1,0,0.3,0,0.3,0.3,1,0,0,0,0,1,0,0),nrow=4,byrow=TRUE)

对于r,我得到:0.4996252 0.4996252 0或者你不应该在Java代码中转置矩阵,如果你想要这个等式的话。相同吗?你是在告诉我mat2最终是对称的吗?在这一页上:你可以看到结果:我只是搜索一种方法来获得相同的值,然后在R中(不带byrow=TRUE),你应该从
mat1.times(mat2)
中获得。如果您打印
mat2
,可能有助于了解发生了什么。
>> a*c

ans =

    0.4996         0    0.4996         0
mat2<-matrix(c(0,0,1,0,0.3,0,0.3,0.3,1,0,0,0,0,1,0,0),nrow=4)
     0       0.3         1         0
     0         0         0         1
     1       0.3         0         0
     0       0.3         0         0
mat2<-matrix(c(0,0,1,0,0.3,0,0.3,0.3,1,0,0,0,0,1,0,0),nrow=4,byrow=TRUE)
     0         0         1         0
   0.3         0       0.3       0.3
     1         0         0         0
     0         1         0         0