nova.core.util.math.MatrixUtil.java Source code

Java tutorial

Introduction

Here is the source code for nova.core.util.math.MatrixUtil.java

Source

/*
 * Copyright (c) 2015 NOVA, All rights reserved.
 * This library is free software, licensed under GNU Lesser General Public License version 3
 *
 * This file is part of NOVA.
 *
 * NOVA is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * NOVA is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with NOVA.  If not, see <http://www.gnu.org/licenses/>.
 */package nova.core.util.math;

import org.apache.commons.math3.exception.DimensionMismatchException;
import org.apache.commons.math3.exception.util.Localizable;
import org.apache.commons.math3.linear.MatrixUtils;
import org.apache.commons.math3.linear.RealMatrix;

import java.util.Locale;

/**
 * @author Kubuxu
 */
public class MatrixUtil {

    public static RealMatrix augment(RealMatrix matrix, int rows, int columns) {
        if (matrix.getRowDimension() > rows)
            throw new DimensionMismatchException(of("rows: {0} !< {1}"), matrix.getRowDimension(), rows);
        if (matrix.getColumnDimension() > columns)
            throw new DimensionMismatchException(of("columns: {0} !< {1}"), matrix.getColumnDimension(), columns);

        RealMatrix augmented = MatrixUtils.createRealMatrix(rows, columns);
        augmented.setSubMatrix(matrix.getData(), 0, 0);
        return augmented;
    }

    public static RealMatrix augmentWithIdentity(RealMatrix matrix, int dimensions) {

        RealMatrix augmented = augment(matrix, dimensions, dimensions);
        for (int i = MathUtil.max(matrix.getRowDimension(), matrix.getColumnDimension())
                + 1; i <= dimensions; i++) {
            augmented.setEntry(i - 1, i - 1, 1);
        }

        return augmented;
    }

    // Little cheat.
    private static Localizable of(String string) {
        return new Localizable() {
            @Override
            public String getSourceString() {
                return string;
            }

            @Override
            public String getLocalizedString(Locale locale) {
                return string;
            }
        };
    }
}