Я хотел бы подсчитать, сколько m матриц, чьи элементы имеют 1 или -1, обладают тем свойством, что все его подматрицы floor(m/2)+1 by n
имеют полный ранг. Мой текущий метод наивен и медленный и находится в следующем коде python/numpy. Он просто выполняет итерации по всем матрицам и проверяет все подматрицы.
import numpy as np
import itertools
from scipy.misc import comb
m = 8
n = 4
rowstochoose = int(np.floor(m/2)+1)
maxnumber = comb(m, rowstochoose, exact = True)
matrix_g=(np.array(x).reshape(m,n) for x in itertools.product([-1,1], repeat = m*n))
nofound = 0
for A in matrix_g:
count = 0
for rows in itertools.combinations(range(m), int(rowstochoose)):
if (np.linalg.matrix_rank(A[list(rows)]) == int(min(n,rowstochoose))):
count+=1
else:
break
if (count == maxnumber):
nofound+=1
print nofound, 2**(m*n)
Есть ли лучший/более быстрый способ сделать это? Я бы хотел сделать этот расчет для n и m до 20, но любые существенные улучшения были бы большими.
Контекст. Я заинтересован в получении точных решений для https://math.stackexchange.com/info/640780/probability-that-every-vector-is-not-orthogonal-to-half-of-the-others.
В качестве точки данных для сравнения реализаций. n,m = 4,4
должен выводить 26880. n,m=5,5
для меня слишком медленно. Для n =
2 и m = 2,3,4,5,6
выходы должны быть 8, 0, 96, 0, 1280
.
Текущее состояние 2 февраля 2014:
- Ответ leewangzhong быстрый, но неверен для m > n. leewangzhong рассматривает, как это исправить.
- Ответ Hooked не выполняется для m > n.