Una forma sencilla y rápida de aprender JAVA, observando y deduciendo cómo se comporta el lenguaje a través de ejemplos prácticos.

Archivo del blog

jueves, 11 de julio de 2024

Conversor matriz de distancias a coordenadas cartesianas(MDS) usando librería "Apache Commons Math".

 Este algoritmo implementa el algoritmo de Escalamiento Multidimensional (MDS) para transformar matrices de distancias en coordenadas cartesianas utilizando la librería "Apache Commons Math".

Requisitos:
- NetBeans IDE
- Apache Commons Math (versión 3.6.1)

Pasos:
1. Descarga la librería Apache Commons Math 3.6.1 desde:
   https://archive.apache.org/dist/commons/math/binaries/
2. Busca y descarga el archivo "commons-math3-3.6.1-bin.zip".
3. En NetBeans, añadir la librería al proyecto.



Código Java (DistanceToCoordinates.java):

package distancetocoordinates;

import org.apache.commons.math3.linear.Array2DRowRealMatrix;
import org.apache.commons.math3.linear.EigenDecomposition;
import org.apache.commons.math3.linear.RealMatrix;

public class DistanceToCoordinates {

    private final double[][] distanceMatrix;
    private final int dimensions;

    public DistanceToCoordinates(double[][] distanceMatrix) {
        this.distanceMatrix = distanceMatrix;
        this.dimensions = distanceMatrix.length;
    }

    public double[][] calculateCoordinates() {
        // Paso 1: Calcular la matriz B
        double[][] B = calculateBMatrix();

        // Paso 2: Realizar la descomposición en valores propios de B
        EigenDecomposition eigen = new EigenDecomposition(new Array2DRowRealMatrix(B));

        // Paso 3: Obtener los valores propios y vectores propios
        double[] eigenvalues = eigen.getRealEigenvalues();
        RealMatrix eigenvectors = eigen.getV();

        // Paso 4: Ordenar los valores propios en orden descendente
        Integer[] indices = new Integer[dimensions];
        for (int i = 0; i < dimensions; i++) {
            indices[i] = i;
        }
        java.util.Arrays.sort(indices, (a, b) -> Double.compare(eigenvalues[b], eigenvalues[a]));

        // Paso 5: Calcular las coordenadas
        double[][] coordinates = new double[dimensions][dimensions];
        for (int i = 0; i < dimensions; i++) {
            for (int j = 0; j < dimensions; j++) {
                coordinates[i][j] = Math.sqrt(Math.max(0, eigenvalues[indices[j]])) * eigenvectors.getEntry(i, indices[j]);
            }
        }

        return coordinates;
    }

    private double[][] calculateBMatrix() {
        double[][] B = new double[dimensions][dimensions];
        double[] rowMeans = new double[dimensions];
        double totalMean = 0;

        // Calcular los cuadrados de las distancias
        for (int i = 0; i < dimensions; i++) {
            for (int j = 0; j < dimensions; j++) {
                B[i][j] = -0.5 * distanceMatrix[i][j] * distanceMatrix[i][j];
                rowMeans[i] += B[i][j];
                totalMean += B[i][j];
            }
            rowMeans[i] /= dimensions;
        }
        totalMean /= (dimensions * dimensions);

        // Centrar la matriz B
        for (int i = 0; i < dimensions; i++) {
            for (int j = 0; j < dimensions; j++) {
                B[i][j] = B[i][j] - rowMeans[i] - rowMeans[j] + totalMean;
            }
        }

        return B;
    }

    public static void main(String[] args) {
        double[][] distanceMatrix = {
            {0, 3538196.0, 3735982.0, 6458578.0, 4011596.0, 1278244.0, 4456652.0, 7001752.0},
            {3538196.0, 0, 6073624.0, 9765551.0, 5373577.0, 8563521.0, 9075418.0, 7378972.0},
            {3735982.0, 6073624.0, 0, 4434730.0, 1077102.0, 1125242.0, 3435080.0, 2347484.0},
            {6458578.0, 9765551.0, 4434730.0, 0, 7999311.0, 3946544.0, 1846094.0, 1283370.0},
            {4011596.0, 5373577.0, 1077102.0, 7999311.0, 0, 8920411.0, 1777521.0, 7183199.0},
            {1278244.0, 8563521.0, 1125242.0, 3946544.0, 8920411.0, 0, 6221466.0, 7883823.0},
            {4456652.0, 9075418.0, 3435080.0, 1846094.0, 1777521.0, 6221466.0, 0, 2385324.0},
            {7001752.0, 7378972.0, 2347484.0, 1283370.0, 7183199.0, 7883823.0, 2385324.0, 0}
        };

        DistanceToCoordinates calculator = new DistanceToCoordinates(distanceMatrix);
        double[][] coordinates = calculator.calculateCoordinates();

        // Imprimir las coordenadas
        for (int i = 0; i < coordinates.length; i++) {
            System.out.print("Nodo " + (char) ('A' + i) + ": [ ");
            for (int j = 0; j < coordinates[i].length; j++) {
                System.out.printf("%.4f ", coordinates[i][j]);
            }
            System.out.println("]");
        }
    }
}


Resultado:

run:
Nodo A: [ -2109176,7652 -2280795,2868 943542,6755 1167238,5398 -0,0000 -0,0000 -0,0000 0,0000 ]
Nodo B: [ -5501880,3926 -340732,2628 -2558730,8576 335704,8847 -0,0000 0,0000 0,0000 0,0000 ]
Nodo C: [ 100046,1854 -133636,2798 255465,7042 -1991154,7275 -0,0000 -0,0000 -0,0000 0,0000 ]
Nodo D: [ 4430934,9160 -101468,6811 -792915,6722 616290,8194 -0,0000 0,0000 -0,0000 0,0000 ]
Nodo E: [ -2944669,9418 2839449,1084 2485778,2633 -376992,5883 -0,0000 0,0000 -0,0000 -0,0000 ]
Nodo F: [ 1720031,9254 -4810714,6137 579380,6506 -443374,3002 -0,0000 -0,0000 0,0000 -0,0000 ]
Nodo G: [ 2087917,4093 2241964,4880 1969418,4176 812990,9949 -0,0000 -0,0000 0,0000 0,0000 ]
Nodo H: [ 2216796,6634 2585933,5278 -2881939,1813 -120703,6228 -0,0000 -0,0000 -0,0000 -0,0000 ]
BUILD SUCCESSFUL (total time: 0 seconds)

Con la tecnología de Blogger.