package org.geogebra.common.kernel.advanced; import org.geogebra.common.kernel.Construction; import org.geogebra.common.kernel.Kernel; import org.geogebra.common.kernel.algos.AlgoElement; import org.geogebra.common.kernel.commands.Commands; import org.geogebra.common.kernel.geos.GeoElement; import org.geogebra.common.kernel.geos.GeoList; import org.geogebra.common.kernel.geos.GeoNumeric; import org.geogebra.common.util.GgbMat; public class AlgoMatrixRank extends AlgoElement { private GeoList inputList; private GeoNumeric rank; public AlgoMatrixRank(Construction cons, String label, GeoList matrix) { super(cons); this.inputList = matrix; rank = new GeoNumeric(cons); setInputOutput(); compute(); rank.setLabel(label); } @Override protected void setInputOutput() { setOnlyOutput(rank); input = new GeoElement[] { inputList }; setDependencies(); } @Override public void compute() { GgbMat matrix = new GgbMat(inputList); if (matrix.isUndefined()) { rank.setUndefined(); return; } matrix.reducedRowEchelonFormImmediate(); int rows = matrix.getRowDimension(); int cols = matrix.getColumnDimension(); for (int i = 0; i < rows; i++) { boolean onlyZeros = true; for (int j = 0; j < cols; j++) { if (!Kernel.isZero(matrix.getEntry(i, j))) { onlyZeros = false; break; } } if (onlyZeros) { rank.setValue(i); return; } } rank.setValue(rows); } @Override public Commands getClassName() { return Commands.MatrixRank; } public GeoNumeric getResult() { return rank; } }