умножить матрицу CSR на вектор - PullRequest
1 голос
/ 21 апреля 2019

Я следил за этим сообщением стекопотока по умножению матрицы csr на вектор и внедрить его в python и получить список ошибок из диапазона.

Вот мой код:

def MatrixMultiplication(data,row_ptr,col_ptr,vec):
  ResultMatrix =[]
  vec_len = len(vec)
  for i in range(0,vec_len):
    ResultMatrix.insert(i,0)
  for i in range(0,vec_len):
    start, end = row_ptr[i], row_ptr[i + 1]
    for k in range(start, end):
      ResultMatrix[i] = ResultMatrix[i]+data[k]*vec[col_ptr[k]]
  return ResultMatrix

data = [2, 4, 7, 1, 3, 2]
row_ptr =  [2,3 ,5, 5 ,6]
col_ptr = [1 ,3, 4, 0, 3, 3]
vec = [2,3, 5, 4, 2]

MatrixMultiplication(data,row_ptr,col_ptr,vec)

Пожалуйста, помогите мне, где я иду не так.

Вывод должен быть: [22 14 14 0 8]

Ошибка:

IndexError: list index out of range
---------------------------------------------------------------------------
IndexError                                Traceback (most recent call last)
<command-338158343473691> in <module>()
----> 1 MatrixMultiplication(data,row_ptr,col_ptr,vec)

<command-3658506804172571> in MatrixMultiplication(data, row_ptr, col_ptr, vec)
      5     ResultMatrix.insert(i,0)
      6   for i in range(0,vec_len):
----> 7     start, end = row_ptr[i], row_ptr[i + 1]
      8     for k in range(start, end):
      9       ResultMatrix[i] = ResultMatrix[i]+data[k]*vec[col_ptr[k]]

IndexError: list index out of range

FYI:

последний элемент row_ptr будет размером списка данных

1 Ответ

0 голосов
/ 21 апреля 2019

Сообщение об ошибке довольно очевидно: вы пытаетесь получить доступ к row_ptr[i + 1] в цикле for, который идет до vec_len, что является длиной вашего списка. Когда вы достигли последней итерации цикла for и i = vec_len - 1, тогда i + 1 = vec_len, что находится вне диапазона вашего списка (помните, списки Python инициализируются 0).

Чтобы предотвратить эту ошибку, ваш диапазон должен доходить только до vec_len - 1 в секунду для цикла.

...