fix tests

This commit is contained in:
Dennis Eichhorn 2023-10-23 23:10:36 +00:00
parent 45bab0c041
commit 1b738dfe5a
3 changed files with 108 additions and 10 deletions

View File

@ -27,7 +27,7 @@ use phpOMS\Math\Matrix\Exception\InvalidDimensionException;
final class Algebra final class Algebra
{ {
/** /**
* Get the dot product of two arrays * Get the product of two arrays
* *
* @param array $value1 Value 1 is a matrix or a vector * @param array $value1 Value 1 is a matrix or a vector
* @param array $value2 Value 2 is a matrix or vector (cannot be a matrix if value1 is a vector) * @param array $value2 Value 2 is a matrix or vector (cannot be a matrix if value1 is a vector)
@ -39,7 +39,7 @@ final class Algebra
* *
* @since 1.0.0 * @since 1.0.0
*/ */
public static function dot(array $value1, array $value2) : int|float|array public static function mult(array $value1, array $value2) : int|float|array
{ {
$m1 = \count($value1); $m1 = \count($value1);
$n1 = ($isMatrix1 = \is_array($value1[0])) ? \count($value1[0]) : 1; $n1 = ($isMatrix1 = \is_array($value1[0])) ? \count($value1[0]) : 1;
@ -47,6 +47,14 @@ final class Algebra
$m2 = \count($value2); $m2 = \count($value2);
$n2 = ($isMatrix2 = \is_array($value2[0])) ? \count($value2[0]) : 1; $n2 = ($isMatrix2 = \is_array($value2[0])) ? \count($value2[0]) : 1;
if (!$isMatrix1 && $isMatrix2) {
$m1 = \count($value1);
$n1 = ($isMatrix1 = \is_array($value1[0])) ? \count($value1[0]) : 1;
$m2 = \count($value2);
$n2 = ($isMatrix2 = \is_array($value2[0])) ? \count($value2[0]) : 1;
}
$result = null; $result = null;
if ($isMatrix1 && $isMatrix2) { if ($isMatrix1 && $isMatrix2) {
@ -93,6 +101,37 @@ final class Algebra
return $result; return $result;
} }
/**
* Calculate the eucledian dot product
*
* @param array $value1 Vector 1
* @param array $value2 Vector 2
*
* @return float
*
* @since 1.0.0
*/
public function dot(array $value1, array $value2) : float
{
$length = \count($value1);
$m1 = 0;
$m2 = 0;
$prod = 0;
for ($i = 0; $i < $length; ++$i) {
$m1 += $value1[$i] * $value1[$i];
$m2 += $value2[$i] * $value2[$i];
$prod += $value1[$i] * $value2[$i];
}
$m1 = \sqrt($m1);
$m2 = \sqrt($m2);
$cos = $prod / ($m1 * $m2);
return $m1 * $m2 * $cos;
}
/** /**
* Calculate the vector corss product * Calculate the vector corss product
* *

View File

@ -123,6 +123,65 @@ final class Vector extends Matrix
return $dotProduct / ($magnitude1 * $magnitude2); return $dotProduct / ($magnitude1 * $magnitude2);
} }
/**
* Calculate the eucledian dot product
*
* @param selft $vector Vector
*
* @return float
*
* @since 1.0.0
*/
public function dot(self $vector) : float
{
$length = $this->m;
$m1 = 0;
$m2 = 0;
$prod = 0;
for ($i = 0; $i < $length; ++$i) {
$m1 += $this->matrix[$i][0] * $this->matrix[$i][0];
$m2 += $vector->matrix[$i][0] * $vector->matrix[$i][0];
$prod += $this->matrix[$i][0] * $vector->matrix[$i][0];
}
$m1 = \sqrt($m1);
$m2 = \sqrt($m2);
$cos = $prod / ($m1 * $m2);
return $m1 * $m2 * $cos;
}
/**
* Calculate the angle between two vectors
*
* @param self $vector Vector
*
* @return float
*
* @since 1.0.0
*/
public function angle(self $vector) : float
{
$length = $this->m;
$m1 = 0;
$m2 = 0;
$prod = 0;
for ($i = 0; $i < $length; ++$i) {
$m1 += $this->matrix[$i][0] * $this->matrix[$i][0];
$m2 += $vector->matrix[$i][0] * $vector->matrix[$i][0];
$prod += $this->matrix[$i][0] * $vector->matrix[$i][0];
}
$m1 = \sqrt($m1);
$m2 = \sqrt($m2);
return \acos($prod / ($m1 * $m2));
}
/** /**
* Calculate the cross product * Calculate the cross product
* *

View File

@ -23,22 +23,22 @@ use phpOMS\Math\Functions\Algebra;
*/ */
final class AlgebraTest extends \PHPUnit\Framework\TestCase final class AlgebraTest extends \PHPUnit\Framework\TestCase
{ {
public function testDotVectors() : void public function testMultVectors() : void
{ {
self::assertEquals( self::assertEquals(
3, 3,
Algebra::dot([1, 3, -5], [4, -2, -1]) Algebra::mult([1, 3, -5], [4, -2, -1])
); );
} }
public function testDotMatrices() : void public function testMultMatrices() : void
{ {
self::assertEquals( self::assertEquals(
[ [
[58, 64], [58, 64],
[139, 154], [139, 154],
], ],
Algebra::dot( Algebra::mult(
[ [
[1, 2, 3], [1, 2, 3],
[4, 5, 6], [4, 5, 6],
@ -52,11 +52,11 @@ final class AlgebraTest extends \PHPUnit\Framework\TestCase
); );
} }
public function testDotVectorMatrix() : void public function testMultVectorMatrix() : void
{ {
self::assertEquals( self::assertEquals(
[11, 39, 53], [11, 39, 53],
Algebra::dot( Algebra::mult(
[3, 4], [3, 4],
[ [
[1, 5, 7], [1, 5, 7],
@ -66,11 +66,11 @@ final class AlgebraTest extends \PHPUnit\Framework\TestCase
); );
} }
public function testDotMatrixVector() : void public function testMultMatrixVector() : void
{ {
self::assertEquals( self::assertEquals(
[11, 39, 53], [11, 39, 53],
Algebra::dot( Algebra::mult(
[ [
[1, 2], [1, 2],
[5, 6], [5, 6],