Calculates the Between-Class Scatter matrix
    
    Parameters:
    -----------
    X : array-like, shape (m, n) - the samples
    y : array-like, shape (m, ) - the class labels

    Returns:
    --------
    between_class_scatter_matrix : array-like, shape (n, n)

def calculate_between_class_scatter_matrix(X, y):
    """Calculates the Between-Class Scatter matrix
    
    Parameters:
    -----------
    X : array-like, shape (m, n) - the samples
    y : array-like, shape (m, ) - the class labels

    Returns:
    --------
    between_class_scatter_matrix : array-like, shape (n, n)
    
    """

    mean_vectors = calculate_mean_vectors(X, y)
    n_features = X.shape[1]
    Sb = np.zeros((n_features, n_features))
    m = np.mean(X, axis=0).reshape(n_features, 1)

    for cl, m_i in zip(np.unique(y), mean_vectors):
        v = m_i.reshape(n_features, 1) - m
        Sb += X[y == cl, :].shape[0] * v @ v.T

    return Sb