public
function
get_complement(
$data
,
$i
,
$j
) {
$x
=
count
(
$data
);
$y
=
count
(
$data
[0]);
$data2
=[];
for
(
$k
= 0;
$k
<
$x
-1;
$k
++) {
if
(
$k
<
$i
) {
for
(
$kk
= 0;
$kk
<
$y
-1;
$kk
++) {
if
(
$kk
<
$j
) {
$data2
[
$k
][
$kk
] =
$data
[
$k
][
$kk
];
}
else
{
$data2
[
$k
][
$kk
] =
$data
[
$k
][
$kk
+1];
}
}
}
else
{
for
(
$kk
= 0;
$kk
<
$y
-1;
$kk
++) {
if
(
$kk
<
$j
) {
$data2
[
$k
][
$kk
] =
$data
[
$k
+1][
$kk
];
}
else
{
$data2
[
$k
][
$kk
] =
$data
[
$k
+1][
$kk
+1];
}
}
}
}
return
$data2
;
}
public
function
cal_det(
$data
) {
$ans
= 0;
if
(
count
(
$data
[0]) === 2) {
$ans
=
$data
[0][0] *
$data
[1][1] -
$data
[0][1] *
$data
[1][0];
}
else
{
for
(
$i
= 0;
$i
<
count
(
$data
[0]);
$i
++) {
$data_temp
=
$this
->get_complement(
$data
, 0,
$i
);
if
(
$i
% 2 === 0) {
$ans
=
$ans
+
$data
[0][
$i
] * (
$this
->cal_det(
$data_temp
));
}
else
{
$ans
=
$ans
-
$data
[0][
$i
] * (
$this
->cal_det(
$data_temp
));
}
}
}
return
$ans
;
}
public
function
ajoint(
$data
) {
$m
=
count
(
$data
);
$n
=
count
(
$data
[0]);
$data2
=[];
for
(
$i
= 0;
$i
<
$m
;
$i
++) {
for
(
$j
= 0;
$j
<
$n
;
$j
++) {
if
((
$i
+
$j
) % 2 === 0) {
$data2
[
$i
][
$j
] =
$this
->cal_det(
$this
->get_complement(
$data
,
$i
,
$j
));
}
else
{
$data2
[
$i
][
$j
] = -
$this
->cal_det(
$this
->get_complement(
$data
,
$i
,
$j
));
}
}
}
return
$this
->trans(
$data2
);
}
public
function
trans(
$data
) {
$i
=
count
(
$data
);
$j
=
count
(
$data
[0]);
$data2
=[];
for
(
$k2
= 0;
$k2
<
$j
;
$k2
++) {
for
(
$k1
= 0;
$k1
<
$i
;
$k1
++) {
$data2
[
$k2
][
$k1
] =
$data
[
$k1
][
$k2
];
}
}
return
$data2
;
}
public
function
inv(
$data
) {
$m
=
count
(
$data
);
$n
=
count
(
$data
[0]);
$data2
=[];
$det_val
=
$this
->cal_det(
$data
);
$data2
=
$this
->ajoint(
$data
);
for
(
$i
= 0;
$i
<
$m
;
$i
++) {
for
(
$j
= 0;
$j
<
$n
;
$j
++) {
$data2
[
$i
][
$j
] =
$data2
[
$i
][
$j
] /
$det_val
;
}
}
return
$data2
;
}
public
function
getProduct(
$data1
,
$data2
) {
$m1
=
count
(
$data1
);
$n1
=
count
(
$data1
[0]);
$m2
=
count
(
$data2
);
$n2
=
count
(
$data2
[0]);
$data_new
=[];
if
(
$n1
!==
$m2
) {
return
false;
}
else
{
for
(
$i
= 0;
$i
<=
$m1
-1;
$i
++) {
for
(
$k
= 0;
$k
<=
$n2
-1;
$k
++) {
$data_new
[
$i
][
$k
] = 0;
for
(
$j
= 0;
$j
<=
$n1
-1;
$j
++) {
$data_new
[
$i
][
$k
] +=
$data1
[
$i
][
$j
] *
$data2
[
$j
][
$k
];
}
}
}
}
return
$data_new
;
}
public
function
getParams(
$arr_x
,
$arr_y
) {
$final
=[];
$arr_x_t
=
$this
->trans(
$arr_x
);
$result
=
$this
->getProduct(
$this
->getProduct(
$this
->inv(
$this
->getProduct(
$arr_x_t
,
$arr_x
)),
$arr_x_t
),
$arr_y
);
foreach
(
$result
as
$key
=>
$val
) {
foreach
(
$val
as
$_k
=>
$_v
) {
$final
[] =
$_v
;
}
}
return
$final
;
}