Может ли кто-нибудь помочь мне с тем, как реализовать умножение матрицы на вектор в методе Compressed Sparse Row (CSR) в Pyspark & Python?
y = A * X
Где представлено A
в формате CSR в трех матрицах Val
, RowPtr
и Col
.Также X
- это вектор.
Matrix A
- это разреженная матрица, которая хранится в CSR с использованием трех массивов:
Val[N]
: содержит значение ненулевых элементов
RowPtr[N]
: содержит диапазон индекса строки ненулевых элементов (последний элемент в RowPtr - размер массива Val)
Col[N]
: содержит индекс столбца ненулевых элементов
Вы можете обратиться к здесь и здесь , чтобы узнать больше о представлении матрицы CSR.
Алгоритм выглядит следующим образом:
Умножитьматрица (хранится с помощью метода Compressed Sparse Row) с вектором d[N]
:
for (k = 0; k < N; k = k + 1)
result[i] = 0;
for (i = 0; i < N; i = i + 1)
{
for (k = RowPtr[i]; k < RowPtr[i+1]; k = k + 1)
{
result[i] = result[i] + Val[k]*d[Col[k]];
}
}
n = len(dense_matrix)
# res = dense X csr
csr_row = 0 # Current row in CSR matrix
for i in range(n):
start, end = row_ptr[i], row_ptr[i + 1]
for j in range(start, end):
col, csr_value = col_idx[j], csr_values[j]
for k in range(n):
dense_value = dense_matrix[k][csr_row]
res[k][col] += csr_value * dense_value
csr_row += 1
print res