Умножение двух матриц с помощью Java

Я пытаюсь умножить 2 матрицы. Я пробовал с программным обеспечением R: проверьте эту тему: Умножение двух матриц в 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());

Когда отображается мат1, я получаю:

0.25018740608813655 0.2498123125257854  0.2501874060881363  0.24981231252578548

вместо

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)

}

mat1<-matrix(c(0.25,0.25,0.25,0.25),nrow=1)
mat2<-matrix(c(0,0,1,0,0.3,0,0.3,0.3,1,0,0,0,0,1,0,0),nrow=4)
mat1%*%t(mpower(mat2,10000))

я получил

[1,] 0.4996252    0 0.4996252    0

person robert trudel    schedule 27.03.2012    source источник
comment
с r я получаю: 0,4996252 0 0,4996252 0   -  person robert trudel    schedule 27.03.2012


Ответы (1)


Только что сделал это в 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, потому что вам нужно byrow = TRUE в ваших as.matrix операторах.

Чтобы уточнить:

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
person trutheality    schedule 27.03.2012
comment
Или вам не нужно было транспонировать матрицу в коде Java, если вы хотите это уравнение. - person trutheality; 28.03.2012
comment
Такой же? Вы хотите сказать, что мат2 оказался симметричным? - person trutheality; 28.03.2012
comment
на этой странице: benhur.teluq. uqam.ca/SPIP/inf6104/ вы можете увидеть результат: static. inky.ws/image/1595/image.jpg - person robert trudel; 28.03.2012
comment
я просто ищу способ получить то же значение, что и в R (без byrow=TRUE) - person robert trudel; 28.03.2012
comment
Вы должны были получить это от mat1.times(mat2). Возможно, если вы напечатаете mat2, это поможет понять, что происходит. - person trutheality; 28.03.2012
comment
без питания я получаю: 0,33325 0,25 0,33325 0,08325 - person robert trudel; 28.03.2012
comment
мощность кажется проблемой, которую я изменил на: } вернуть м; } - person robert trudel; 28.03.2012