, . , , SQL Server, , . - O(n^3) , . , Cholesky decposition, - . :
SQL Server 2008, table datatype
( , , ...)
-, . , : PD, . . , ( Laplace), -, .
Groundwork
, :
create type Matrix
as table ( Row int, Col int, Val float )
go
, , table SQL Server 2008.
-, ( ):
create function Determinant ( @matrix Matrix readonly )
returns float
as
begin
if ((select count(*) from @matrix) = 1)
return (select Val from @matrix)
, ( 1x1), . -, "" , 1..n
declare @rowMap table ( fr_row int, to_row int )
declare @colMap table ( fr_col int, to_col int )
insert @rowMap
select row, row_number() over(order by row) from @matrix
group by row
insert @colMap
select col, row_number() over(order by col) from @matrix
group by col
declare @canonicalMatrix Matrix
insert @canonicalMatrix
select
to_row, to_col, Val
from @matrix m
inner join @rowMap rm on m.row = rm.fr_row
inner join @colMap cm on m.col = cm.fr_col
, . - , , , ,
return
(
select sum(
(case col % 2
when 1 then 1
when 0 then -1
end
)
* Val
* dbo.DeterminantOfMinor ( @canonicalMatrix, 1, col )
) from @canonicalMatrix where row = 1
)
end
go
, DeterminantOfMinor , table SQL Server:
create function dbo.DeterminantOfMinor (
@matrix Matrix readonly
, @drop_row int
, @drop_col int
)
returns float
as
begin
declare @minor Matrix
insert @minor select * from @matrix
where row <> @drop_row and col <> @drop_col
return
dbo.Determinant( @minor )
end
go
, .
, PD, . , () , , , , , ( ):
create function dbo.is_positive_definite ( @matrix Matrix readonly )
returns bit
as
begin
if ((select count(*) from @matrix) = 1)
return (select case when Val > 0 then 1 else 0 end from @matrix)
, :
declare @smallerMat Matrix
insert @smallerMat
select row, col, Val from @matrix
where row < (select max(row) from @matrix)
and col < (select max(col) from @matrix)
, , PD:
-- for our input to be PD, its smaller version must be PD:
return
( select case dbo.is_positive_definite( @smallerMat )
when 1 then
(select case
when dbo.Determinant ( @matrix ) > 0
then 1
else 0
end)
else 0
end
)
end
go
!
:
declare @test Matrix
insert @test values ( 1, 1, 1.00 )
insert @test values ( 1, 2, 0.68 )
insert @test values ( 1, 3, 0.24 )
insert @test values ( 6, 4, 0.00 )
insert @test values ( 6, 5, 0.00 )
insert @test values ( 6, 6, 1.00 )
select dbo.Determinant ( @test )
select dbo.is_positive_definite ( @test )
0.0333962320000001
(1 row(s) affected)
1
(1 row(s) affected)
, -, , .
n , , :
n Time (s)
1 < 1
2 < 1
3 < 1
4 < 1
5 1
6 17
, , . , my:
:
O(n^3)- , memoization
- - ,
Matrix, , , - ,
, , , , .
, , , Cholesky ...