The tensor library is developed by J. Burguet and distributed as an add-on package of GSL. See here and here.
GSL::Tensor.new(rank, dimention)GSL::Tensor.alloc(rank, dimention)GSL::Tensor[rank, dimention]GSL::Tensor.calloc(rank, dimention)GSL::Tensor.copy(tensor)GSL::Tensor.memcpy(dest, src)GSL::Tensor.swap(a, b)GSL::Tensor#set_zeroGSL::Tensor#set_all(x)GSL::Tensor#set(indices, x)GSL::Tensor#[indices]=xGSL::Tensor#get(indices)GSL::Tensor#[indices]Returns the tensor element. If the number of indices given is smaller than the rank of the tensor, the method GSL::Tensor#subtensor is called.
Ex:
irb(main):002:0> t = Tensor.new(2, 3) => #<GSL::Tensor:0x762ae8> irb(main):003:0> t.set(1, 2, 2, 123) => #<GSL::Tensor:0x762ae8> irb(main):004:0> t.get(1, 2, 2) => 123.0 irb(main):005:0> t[0, 0, 2] = 456 => 456 irb(main):006:0> t[0, 0, 2] => 456.0
GSL::Tensor#subtensor(indices)GSL::Tensor#[indices]Return a subtensor.
Ex:
irb(main):001:0> require("gsl")
=> true
irb(main):002:0> t = Vector[1..125].to_tensor(3, 5)
=> GSL::Tensor:
[ 1.000e+00 2.000e+00 3.000e+00 4.000e+00 5.000e+00 6.000e+00 7.000e+00 ... ]
irb(main):003:0> t[0]
=> GSL::Tensor::View:
[ 1.000e+00 2.000e+00 3.000e+00 4.000e+00 5.000e+00
6.000e+00 7.000e+00 8.000e+00 9.000e+00 1.000e+01
1.100e+01 1.200e+01 1.300e+01 1.400e+01 1.500e+01
1.600e+01 1.700e+01 1.800e+01 1.900e+01 2.000e+01
2.100e+01 2.200e+01 2.300e+01 2.400e+01 2.500e+01 ]
irb(main):004:0> t[0,2]
=> GSL::Tensor::View:
[ 1.100e+01 1.200e+01 1.300e+01 1.400e+01 1.500e+01 ]
irb(main):005:0> t[3,1]
=> GSL::Tensor::View:
[ 8.100e+01 8.200e+01 8.300e+01 8.400e+01 8.500e+01 ]
irb(main):006:0> t[1][2]
=> GSL::Tensor::View:
[ 3.600e+01 3.700e+01 3.800e+01 3.900e+01 4.000e+01 ]GSL::Tensor#swap_indices(i, j)GSL::Tensor#dataGSL::Vector::View.GSL::Tensor#to_vGSL::Tensor#to_vectorGSL::Vector::View object.GSL::Tensor#to_matrixGSL::Matrix::View object.GSL::Tensor#fwrite(io)GSL::Tensor#fwrite(filename)GSL::Tensor#fread(io)GSL::Tensor#fread(filename)GSL::Tensor#fprintf(io, format="%g")GSL::Tensor#fprintf(filename, format="%g")GSL::Tensor#fscanf(io)GSL::Tensor#fscanf(filename)GSL::Tensor#maxGSL::Tensor#minGSL::Tensor#minmaxGSL::Tensor#max_indexGSL::Tensor#min_indexGSL::Tensor#minmax_indexGSL::Tensor#add(b)GSL::Tensor#+(b)GSL::Tensor#add!(b)GSL::Tensor#sub(b)GSL::Tensor#+(b)GSL::Tensor#sub!(b)GSL::Tensor#mul_elements(b)GSL::Tensor#mul_elements!(b)GSL::Tensor#div_elements(b)GSL::Tensor#/(b)GSL::Tensor#div_elements!(b)GSL::Tensor#add_constant(x)GSL::Tensor#add_constant!(x)GSL::Tensor#scale(x)GSL::Tensor#scale!(x)GSL::Tensor#add_diagonal(x)GSL::Tensor#add_diagonal!(x)GSL::Tensor#product(b)GSL::Tensor#*(b)GSL::Tensor#contract(i, j)GSL::Tensor#equal?(b, eps = 1e-10)GSL::Tensor#==(b)true if the tensors have same size and elements
equal to absolute accurary eps for all the indices,
and false otherwise.GSL::Tensor#isnullGSL::Tensor#isnull?true if all the elements of the tensor are zero, and false otherwise.GSL::Tensor#rankGSL::Tensor#dimensionGSL::Tensor#size