У меня есть небольшой проект 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 (единичную матрицу), здесь просто нет арифметических действий, и исходные данные просто копируются.
** Обратите внимание: то, что я использую термин «Вандермонд», я на самом деле имею в виду матрицу идентичности с некоторым количеством строк из добавленной матрицы Вандермонда ( см. комментарии). Эта матрица прекрасна тем, что в ней все нули, и потому, что если вы удалите достаточно строк (по вашему выбору), чтобы сделать ее квадратной, это будет обратимая матрица. И, конечно же, я хотел бы использовать ту же процедуру для преобразования любой из этих инвертированных матриц в оптимизированную серию инструкций.
Как я могу ускорить умножение матриц?
Спасибо!
(отредактировано, чтобы исправить мою ошибку с матрицей Вандермонда)