Умножение вектора с BLAS 'catlas_saxpby не работает должным образом - PullRequest
1 голос
/ 05 июля 2011

Я пытаюсь получить два вектора произвольной длины (типичная длина будет 2048) и умножить элемент на элемент. Таким образом, Z [n] = X [n] * Y [n] для всех n.

Код, который я настроил для тестирования, довольно прост:

float inputX[4] = { 2, 4, 8, 16 };
float inputY[4] = { 2, 4, 8, 16 };

catlas_saxpby(4, 1, inputX, 1, 1, inputY, 1);

Результат переходит во inputY, а результат

4.000000, 8.000000, 16.000000, 32.000000

Что, если они умножали, должно быть 4, 16, 64, 256. Но похоже, что это прибавление.

Так что это не то, что я ожидаю, и документация не дает мне достаточно информации, чтобы понять, что он делает.

Есть идеи?

Apple's documentation for BLAS says this: 

Computes the product of two vectors, scaling each one separately (single-precision).

void catlas_saxpby (
   const int N,
   const float alpha,
   const float *X,
   const int incX,
   const float beta,
   float *Y,
   const int incY
);
Parameters
N
Number of elements in the vector.
alpha
Scaling factor for X.
X
Input vector X.
incX
Stride within X. For example, if incX is 7, every 7th element is used.
beta
Scaling factor for Y.
Y
Input vector Y.
incY
Stride within Y. For example, if incY is 7, every 7th element is used.
Discussion
On return, the contents of vector Y are replaced with the result.

Ответы [ 2 ]

3 голосов
/ 05 июля 2011

Как сказал Адам Розенфилд , документация неверна.Пожалуйста, отправьте сообщение об ошибке.

Кроме этого, есть некоторые исправления к остальной части его ответа.Сначала saxpby вычисляет alpha * X + beta * Y.Во-вторых, и более полезно для вас: в BLAS нет функции, которая делает то, что вы хотите, но есть именно такая функция в vDSP, которая также является частью Accelerate.framework: vDSP_vmul .

2 голосов
/ 05 июля 2011

В документации Apple есть ошибки.Функция saxpby вычисляет выражение alpha*X + beta*Y для скаляров alpha и beta и векторов X и Y.

Я не думаю, что есть функция, доступная для вычисления элемента-мудрое произведение двух векторов, так как это не распространенная операция в линейной алгебре.Вы можете взять диагональ внешнего произведения, но это серьезная трата усилий, поскольку она вычисляет весь внешний продукт (N 2 умножений вместо N).

...