public static <T> Matrix<T> subspaceIntersection(Matrix<T> m1, Matrix<T> m2) { if (m1.m != m2.m) throw new IllegalArgumentException(); if (m1.ring != m2.ring) throw new IllegalArgumentException(); Matrix<T> m = new Matrix<T>(m1.ring, m1.m, m1.n + m2.n); for (int i = 0; i < m1.m; i++) { for (int j = 0; j < m1.n; j++) m.set(i, j, m1.get(i, j)); for (int j = 0; j < m2.n; j++) m.set(i, m1.n + j, m2.get(i, j)); } Matrix<T> kernelBasis = m.getKernelBasis(); return product(m1, kernelBasis.getSubmatrix(m1.n, kernelBasis.n)); }