Current section
Files
Jump to
Current section
Files
lib/linear_algebra.ex
defmodule Numerix.LinearAlgebra do
@moduledoc """
Linear algebra functions used for vector operations,
matrix factorization and matrix transformation.
"""
use Numerix.Tensor
alias Numerix.{Common, Math}
@doc """
The sum of the products of two vectors.
"""
@spec dot(Common.vector(), Common.vector()) :: Common.maybe_float()
def dot(x = %Tensor{}, y = %Tensor{}) do
sum(x * y)
end
def dot(vector1, vector2) do
x = Tensor.new(vector1)
y = Tensor.new(vector2)
dot(x, y)
end
@doc """
The L1 norm of a vector, also known as Manhattan norm.
"""
@spec l1_norm(Common.maybe_vector()) :: Common.maybe_float()
def l1_norm(vector) do
norm(1, vector)
end
@doc """
The L2 norm of a vector, also known as Euclidean norm.
"""
@spec l2_norm(Common.maybe_vector()) :: Common.maybe_float()
def l2_norm(vector) do
norm(2, vector)
end
@doc """
The p-norm of a vector.
"""
@spec norm(integer, Common.maybe_vector()) :: Common.maybe_float()
def norm(_p, nil), do: nil
def norm(p, x = %Tensor{}) do
s = sum(pow(abs(x), p))
Math.nth_root(s, p)
end
def norm(p, vector) do
x = Tensor.new(vector)
norm(p, x)
end
end