protected double angle(NumberVector<?, ?> v1, NumberVector<?, ?> v2) {
if(v1 instanceof SparseNumberVector<?, ?> && v2 instanceof SparseNumberVector<?, ?>) {
return angleSparse((SparseNumberVector<?, ?>) v1, (SparseNumberVector<?, ?>) v2);
}
Vector m1 = v1.getColumnVector();
m1.normalize();
Vector m2 = v2.getColumnVector();
m2.normalize();
return m1.transposeTimes(m2);
}