Умножение вещественной матрицы на комплексный вектор с использованием BLAS

#c #matrix-multiplication #blas

#c #матрица-умножение #blas

Вопрос:

Как я могу использовать Blas для умножения вещественной матрицы на комплексный вектор? Когда я использую такие функции, как ccsrgemv() Я получаю ошибки несоответствия типов?

 error: argument of type "float *" is incompatible with parameter of type "std::complex<float> *"
  

Комментарии:

1. Для людей, голосующих за закрытие: это реальный вопрос.

Ответ №1:

Используйте два умножения матрицы на векторы (A * (x iy) = A * x i A * y). Точнее, рассматривайте ваш комплексный вектор как два запутанных вещественных вектора с шагом 2. BLAS позволяет вам это сделать.

ОБНОВЛЕНИЕ: на самом деле, я не заметил, что вы выполняли разреженные BLAS. Для dgemv моего трюка работает, но для csrgemv него нет. Боюсь, вам придется поддерживать действительную и мнимую части отдельно.

Комментарии:

1. Если бы мне нужно было умножить транспонирование сложного плотного вектора на плотную вещественную матрицу (q = c ^T * A), я бы использовал sgemm() / dgemm() routine: call SGEMM('N', 'N', 2, N, N, 1.0, c, 2, A, N, 0.0, q, 2) (в Fortran).