У меня такой же маленький проект на c #, который включает в себя матрицы. Я обрабатываю большие объемы данных, разбивая их на куски n-длины, обрабатывая их как векторы и умножая на матрицу Вандермонда **. Проблема заключается в том, что в зависимости от условий размер патронов и соответствующей матрицы Вандермонда ** может варьироваться. У меня есть общее решение, которое легко прочитать, но слишком медленно:
public byte[] addBlockRedundancy(byte[] data) {
if (data.Length!=numGood) D.error("Expecting data to be just "+numGood+" bytes long");
aMatrix d=aMatrix.newColumnMatrix(this.mod, data);
var r=vandermonde.multiplyBy(d);
return r.ToByteArray();
}//method
Это может обрабатывать около 1/4 мегабайта в секунду на моем i5 U470 @ 1,33 ГГц. Я могу сделать это быстрее, вручную вставляя матричное умножение:
int o=0;
int d=0;
for (d=0; d<data.Length-numGood; d+=numGood) {
for (int r=0; r<numGood+numRedundant; r++) {
Byte value=0;
for (int c=0; c<numGood; c++) {
value=mod.Add(value, mod.Multiply(vandermonde.get(r, c), data[d+c]));
}//for
output[r][o]=value;
}//for
o++;
}//for
Это может обрабатывать около 1 мегабит в секунду.
(Обратите внимание, что "мод" выполняет операции над GF (2 ^ 8) по модулю моего любимого неприводимого полинома.)
Я знаю, что это может быть намного быстрее: в конце концов, матрица Вандермонда ** в основном нули. Я должен быть в состоянии создать процедуру или найти процедуру, которая может взять мою матрицу и вернуть оптимизированный метод, который будет эффективно умножать векторы на данную матрицу, но быстрее. Затем, когда я даю этой подпрограмме матрицу Вандермонда 5x5 (единичную матрицу), просто не нужно выполнять арифметику, а исходные данные просто копируются.
** Обратите внимание: что я использую термин «Вандермонде», я на самом деле имею в виду матрицу идентичности с некоторым количеством строк из матрицы Вандермонда (см. Комментарии). Эта матрица замечательна из-за всех нулей, и потому что, если вы удалите достаточно строк (по вашему выбору), чтобы сделать ее квадратной, это обратимая матрица. И, конечно же, я хотел бы использовать эту же процедуру для преобразования любой из этих инвертированных матриц в оптимизированный ряд инструкций.
Как мне ускорить умножение матриц?
Спасибо!
(отредактировано, чтобы исправить мою ошибку с помощью матрицы Вандермонда)