Чтобы сохранить вектор, сохраните список его ненулевых позиций и битов + 1 / -1. Вам потребуется байт для бита + 1 / -1.
Если вы действительно хотите сохранить как можно больше памяти, вы можете сохранить длинный BitSet , содержащий информацию + 1 / -1 для всех векторов вместе, и каждый вектор запомнит свой начальный индекс в BitSet.
Чтобы сгенерировать векторы, ортогональные другим, вы можете сделать:
[0 1 0 0 -1 ...]
[1 0 1 0 0 ...] // zeros where the first vector is non-zero
...
Храните связанный список всех доступных 1000 индексов. При создании вектора выберите небольшое случайное число случайных индексов, сгенерируйте вектор с ненулевыми индексами и удалите индексы из списка доступных индексов. Однако таким образом вы быстро исчерпаете доступные индексы. Но в 1000-мерном пространстве есть только 1000 взаимно ортогональных векторов, поэтому вы можете в любом случае создать векторы максимум для 1000 слов.
Кроме того, тот факт, что векторы должны быть ортогональными, означает, что они не могут быть полностью случайными, поскольку действительно случайные векторы могут оказаться неортогональными.