2016-07-24 3 views
3

В Mathematica, я могу сделать расчет тензорного произведения с помощью встроенного Dot[], например, здесь есть тензор pts с рангом 6:Есть ли библиотека C, реализующая тензорный продукт?

SeedRandom[10]; 
pts = RandomReal[1, {7, 7, 7, 5, 6, 5}]; 

(*coeffs = {c1, c2, c3, c4}*) 
coeff = BernsteinBasis[#1, Range[0, #1], #2] & @@@ 
      [email protected]{(Dimensions[pts, 4] - 1), {0.1, 0.2, 0.3, 0.4}}; 
(* 
{{0.531441,0.354294,0.098415,0.01458,0.001215,0.000054,1.*10^-6}, 
{0.262144,0.393216,0.24576,0.08192,0.01536,0.001536,0.000064}, 
{0.117649,0.302526,0.324135,0.18522,0.059535,0.010206,0.000729}, 
{0.1296,0.3456,0.3456,0.1536,0.0256}} 
*) 

(*do tensor product calculation ---> c4.(c3.(c2.(c1.pts))) *) 
Fold[#2.#1 &, pts, coeff] 

enter image description here

enter image description here

Я Google ключевое слово tensor product in C, тогда я обнаружил, что большинство тензорных библиотек написаны на C++, а не ANSI C.

, так что я хотел бы знать:

  • Есть C библиотека, которая реализует Dot[] операцию?
+1

Возможно, вам придется использовать процедуры работы с матрицей BLAS, такие как [cblas_gemm()] (https://software.intel.com/en-us/node/520775) с интерфейсом C, чтобы затем имитировать тензорный продукт. Это в основном повторение того, что сделали эти C++ тензорные библиотеки. – kangshiyin

+0

@kangshiyin Спасибо за ваше предложение. Фактически, мне нужна библиотека c тензорного продукта для реализации «b-сплайновой функции» через оболочку * Mathematica LibraryLink *. См. [Здесь] (http://mathematica.stackexchange.com/questions/120384/why-does-this-librarylink-function-crash) – xyz

+0

Я уверен, что он также может быть реализован с помощью матричного продукта. – kangshiyin

ответ

3

Возможно, вам придется использовать процедуры продукта матрицы BLAS, такие как cblas_gemm() с интерфейсом C для имитации тензорного продукта. Это в основном повторение того, что сделали эти C++ тензорные библиотеки.

Ваш тензорное произведение

c1(1x7) * pts(7x7x7x5x6x5) 

можно рассматривать как матричное произведение

c1(1x7) * mat_pts(7x(7*7*5*6*5*6)) 

, где pts является тензор 6-D, но mat_pts 2-D матрица.

Таким образом, вы можете использовать матричный продукт для расчета тензорного продукта.

Смежные вопросы