AXT,
Пардон, не видел. Татарин уже ответил по существу. Я только его ответ прокомментирую.
Татарин> Первое что сделать - выделить линейно-независимые элементы, поискать в матрице какие-то симметрии, пусть неочевидные (симметрия с перестановками столбцов/строк - тоже симметрия). Ну и т.п. - поиграться с математикой, короче.
Это в первую очередь. Согласен. Идеально бы было найти ранг, но это может быть довольно сложная задача.
Татарин> Можно даже втупую: выписать (машиной, конечно ) полные выражения для элементов результирующего тензора, подставив матрицу как константы и упростить их (поэлементно) машиной.
Даже матрица 32 на 32 и вектор на 32 — уже можно сделать 32 линейные записи по 32 элемента в каждом — распрямить циклы. Если в матрице много 0, 1, 2, то эти выражения вместо умножения легко оптимизируются ручками (для 2 в целочисленной арифметике). Если не делал преобразований матрицы, а есть одинаковые строчки (для вектора столбца), то имеет смысл сравнить значения соответствующие в векторе и не перевычислять.
Татарин> На математике можно выиграть порядки.
Я бы посоветовал погонять умножения и разные запросы в Maple. Она может предоставить совершенно нетривиальный вариант упрощения умножения для конкретной матрицы (матрица, как я понял, константная).
Massaraksh, я думаю, что ручками оптимизоровать выражения при константной матрице будет куда более эффективно. При этом даже можно врубить для данноё ф-ции максимальную оптимизацию выражений при компилировании данной ф-ции по быстродействию в ущерб размеру. Она всё равно уложится в кэш у современных процессоров. Это будет лучше маски, которую надо прикладывать динамически.
AXT, а какие данные (целочисленные? с плавающей? с фиксированной? диапазон значений?), какая точность (если с фиксированной, то может легче смоделировать целочисленной?)?