矩阵代数的难点在于确定什么是矩阵上的域以进行数据建模。它是一个价值吗?它是一个整体的矩阵吗?这不是一个预定义的问题,所以我会给你两个解决方案以及权衡是什么。
解决方案 1:矩阵单元格中的值是一个域:
CREATE TABLE matrix_info (
x_size int,
y_size int,
id serial not null unique,
timestamp not null,
);
CREATE TABLE matrix_cell (
matrix_id int references matrix_info(id),
x int,
y int,
value numeric not null,
primary key (matrix_id, x, y)
);
最大的担忧是这并不能很好地强制矩阵大小。此外,缺失值可用于表示 0,或者可能不允许。将矩阵作为一个整体用作域的想法具有一定的吸引力。在这种情况下:
CREATE TABLE matrix (
id serial not null unique,
timestamp not null,
matrix_data numeric[]
);
请注意,包括 PostgreSQL 在内的许多数据库将强制数组实际上是一个矩阵。然后你需要为乘法等编写自己的函数。我建议以对象关系的方式和在 PostgreSQL 上这样做,因为它对于这类事情是非常可编程的。比如:
CREATE TABLE matrix(int) RETURNS matrix LANGUAGE SQL AS
$$ select * from matrix where id = $1 $$;
CREATE FUNCTION multiply(matrix, matrix) RETURNS matrix LANGUAGE plpgsql AS
$$
DECLARE matrix1 = $1.matrix_data;
matrix2 = $2.matrix_data;
begin
...
end;
$$;
那么你可以将矩阵乘法称为:
SELECT * FROM multiply(matrix(1), matrix(2));
您甚至可以在表格中插入另外两个矩阵的乘积:
INSERT INTO matrix (matrix_data)
SELECT matrix_data FROM multiply(matrix(1), matrix(2));