* Refactor Excel Matrix functions to use external Matrix library rather than JAMA
This commit is contained in:
Mark Baker 2018-11-29 22:25:31 +01:00 committed by GitHub
parent b6a73aec56
commit a5eb64c77f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
11 changed files with 301 additions and 846 deletions

View File

@ -1,10 +1,11 @@
<?php
$finder = PhpCsFixer\Finder::create()
->exclude('vendor')
->exclude(['vendor', 'tests/data/Calculation'])
->in('samples')
->in('src')
->in('tests');
->in('tests/PhpSpreadsheetTests')
;
return PhpCsFixer\Config::create()
->setRiskyAllowed(true)

View File

@ -7,6 +7,11 @@ and this project adheres to [Semantic Versioning](https://semver.org).
## [Unreleased]
### Added
- Refactored Matrix Functions to use external Matrix library
## [1.5.2] - 2018-11-25
### Security

View File

@ -53,11 +53,13 @@
"ext-zip": "*",
"ext-zlib": "*",
"psr/simple-cache": "^1.0",
"markbaker/complex": "^1.4.1"
"markbaker/complex": "^1.4",
"markbaker/matrix": "^1.1"
},
"require-dev": {
"tecnickcom/tcpdf": "^6.2",
"phpunit/phpunit": "^5.7",
"doctrine/instantiator": "^1.0.0",
"dompdf/dompdf": "^0.8.0",
"mpdf/mpdf": "^7.0.0",
"jpgraph/jpgraph": "^4.0",

72
composer.lock generated
View File

@ -4,7 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically"
],
"content-hash": "329d0c155c094a31156a653423fdfd94",
"content-hash": "5e66d1016f24ad7d6495ed4d7a04234d",
"packages": [
{
"name": "markbaker/complex",
@ -101,6 +101,76 @@
],
"time": "2018-10-13T23:28:42+00:00"
},
{
"name": "markbaker/matrix",
"version": "1.1.4",
"source": {
"type": "git",
"url": "https://github.com/MarkBaker/PHPMatrix.git",
"reference": "6ea97472b5baf12119b4f31f802835b820dd6d64"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/MarkBaker/PHPMatrix/zipball/6ea97472b5baf12119b4f31f802835b820dd6d64",
"reference": "6ea97472b5baf12119b4f31f802835b820dd6d64",
"shasum": ""
},
"require": {
"php": "^5.6.0|^7.0.0"
},
"require-dev": {
"dealerdirect/phpcodesniffer-composer-installer": "^0.4.3",
"phpcompatibility/php-compatibility": "^8.0",
"phpdocumentor/phpdocumentor": "2.*",
"phploc/phploc": "2.*",
"phpmd/phpmd": "2.*",
"phpunit/phpunit": "^4.8.35|^5.4.0",
"sebastian/phpcpd": "2.*",
"squizlabs/php_codesniffer": "^3.3.0"
},
"type": "library",
"autoload": {
"psr-4": {
"Matrix\\": "classes/src/"
},
"files": [
"classes/src/functions/adjoint.php",
"classes/src/functions/antidiagonal.php",
"classes/src/functions/cofactors.php",
"classes/src/functions/determinant.php",
"classes/src/functions/diagonal.php",
"classes/src/functions/identity.php",
"classes/src/functions/inverse.php",
"classes/src/functions/minors.php",
"classes/src/functions/trace.php",
"classes/src/functions/transpose.php",
"classes/src/operations/add.php",
"classes/src/operations/directsum.php",
"classes/src/operations/subtract.php",
"classes/src/operations/multiply.php",
"classes/src/operations/divideby.php",
"classes/src/operations/divideinto.php"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Mark Baker",
"email": "mark@lange.demon.co.uk"
}
],
"description": "PHP Class for working with matrices",
"homepage": "https://github.com/MarkBaker/PHPMatrix",
"keywords": [
"mathematics",
"matrix",
"vector"
],
"time": "2018-11-04T22:12:12+00:00"
},
{
"name": "psr/simple-cache",
"version": "1.0.1",

View File

@ -37,6 +37,7 @@ DATE | \PhpOffice\PhpSpreadsheet\Calculation\DateTime::DATE
DATEDIF | \PhpOffice\PhpSpreadsheet\Calculation\DateTime::DATEDIF
DATEVALUE | \PhpOffice\PhpSpreadsheet\Calculation\DateTime::DATEVALUE
DAY | \PhpOffice\PhpSpreadsheet\Calculation\DateTime::DAYOFMONTH
DAYS | \PhpOffice\PhpSpreadsheet\Calculation\DateTime::DAYS
DAYS360 | \PhpOffice\PhpSpreadsheet\Calculation\DateTime::DAYS360
EDATE | \PhpOffice\PhpSpreadsheet\Calculation\DateTime::EDATE
EOMONTH | \PhpOffice\PhpSpreadsheet\Calculation\DateTime::EOMONTH
@ -45,6 +46,7 @@ ISOWEEKNUM | \PhpOffice\PhpSpreadsheet\Calculation\DateTime::ISOWEEKNUM
MINUTE | \PhpOffice\PhpSpreadsheet\Calculation\DateTime::MINUTE
MONTH | \PhpOffice\PhpSpreadsheet\Calculation\DateTime::MONTHOFYEAR
NETWORKDAYS | \PhpOffice\PhpSpreadsheet\Calculation\DateTime::NETWORKDAYS
NETWORKDAYS.INTL | **Not yet Implemented**
NOW | \PhpOffice\PhpSpreadsheet\Calculation\DateTime::DATETIMENOW
SECOND | \PhpOffice\PhpSpreadsheet\Calculation\DateTime::SECOND
TIME | \PhpOffice\PhpSpreadsheet\Calculation\DateTime::TIME
@ -53,6 +55,7 @@ TODAY | \PhpOffice\PhpSpreadsheet\Calculation\DateTime::DATENOW
WEEKDAY | \PhpOffice\PhpSpreadsheet\Calculation\DateTime::WEEKDAY
WEEKNUM | \PhpOffice\PhpSpreadsheet\Calculation\DateTime::WEEKNUM
WORKDAY | \PhpOffice\PhpSpreadsheet\Calculation\DateTime::WORKDAY
WORKDAY.INTL | **Not yet Implemented**
YEAR | \PhpOffice\PhpSpreadsheet\Calculation\DateTime::YEAR
YEARFRAC | \PhpOffice\PhpSpreadsheet\Calculation\DateTime::YEARFRAC
@ -66,7 +69,12 @@ BESSELK | \PhpOffice\PhpSpreadsheet\Calculation\Engineering::BESSELK
BESSELY | \PhpOffice\PhpSpreadsheet\Calculation\Engineering::BESSELY
BIN2DEC | \PhpOffice\PhpSpreadsheet\Calculation\Engineering::BINTODEC
BIN2HEX | \PhpOffice\PhpSpreadsheet\Calculation\Engineering::BINTOHEX
BIN2OCT | \PhpOffice\PhpSpreadsheet\Calculation\Engineering::BINTOOCT
BIN2OCT | \PhpOffice\PhpSpreadsheet\Calculation\Engineeri
BITAND | \PhpOffice\PhpSpreadsheet\Calculation\Engineering::BITAND
BITLSHIFT | \PhpOffice\PhpSpreadsheet\Calculation\Engineering::BITLSHIFT
BITOR | \PhpOffice\PhpSpreadsheet\Calculation\Engineering::BITOR
BITRSHIFT | \PhpOffice\PhpSpreadsheet\Calculation\Engineering::BITRSHIFT
BITXOR | \PhpOffice\PhpSpreadsheet\Calculation\Engineering::BITXOR
COMPLEX | \PhpOffice\PhpSpreadsheet\Calculation\Engineering::COMPLEX
CONVERT | \PhpOffice\PhpSpreadsheet\Calculation\Engineering::CONVERTUOM
DEC2BIN | \PhpOffice\PhpSpreadsheet\Calculation\Engineering::DECTOBIN

View File

@ -43,6 +43,11 @@ BIN2DEC | CATEGORY_ENGINEERING | \PhpOffice\PhpSpreadsheet
BIN2HEX | CATEGORY_ENGINEERING | \PhpOffice\PhpSpreadsheet\Calculation\Engineering::BINTOHEX
BIN2OCT | CATEGORY_ENGINEERING | \PhpOffice\PhpSpreadsheet\Calculation\Engineering::BINTOOCT
BINOMDIST | CATEGORY_STATISTICAL | \PhpOffice\PhpSpreadsheet\Calculation\Statistical::BINOMDIST
BITAND | CATEGORY_ENGINEERING | \PhpOffice\PhpSpreadsheet\Calculation\Engineering::BITAND
BITLSHIFT | CATEGORY_ENGINEERING | \PhpOffice\PhpSpreadsheet\Calculation\Engineering::BITLSHIFT
BITOR | CATEGORY_ENGINEERING | \PhpOffice\PhpSpreadsheet\Calculation\Engineering::BITOR
BITRSHIFT | CATEGORY_ENGINEERING | \PhpOffice\PhpSpreadsheet\Calculation\Engineering::BITRSHIFT
BITXOR | CATEGORY_ENGINEERING | \PhpOffice\PhpSpreadsheet\Calculation\Engineering::BITXOR
## C
@ -104,6 +109,7 @@ DATEDIF | CATEGORY_DATE_AND_TIME | \PhpOffice\PhpSpreadsheet
DATEVALUE | CATEGORY_DATE_AND_TIME | \PhpOffice\PhpSpreadsheet\Calculation\DateTime::DATEVALUE
DAVERAGE | CATEGORY_DATABASE | \PhpOffice\PhpSpreadsheet\Calculation\Database::DAVERAGE
DAY | CATEGORY_DATE_AND_TIME | \PhpOffice\PhpSpreadsheet\Calculation\DateTime::DAYOFMONTH
DAYS | CATEGORY_DATE_AND_TIME | \PhpOffice\PhpSpreadsheet\Calculation\DateTime::DAYS
DAYS360 | CATEGORY_DATE_AND_TIME | \PhpOffice\PhpSpreadsheet\Calculation\DateTime::DAYS360
DB | CATEGORY_FINANCIAL | \PhpOffice\PhpSpreadsheet\Calculation\Financial::DB
DCOUNT | CATEGORY_DATABASE | \PhpOffice\PhpSpreadsheet\Calculation\Database::DCOUNT
@ -317,6 +323,7 @@ N | CATEGORY_INFORMATION | \PhpOffice\PhpSpreadsheet
NA | CATEGORY_INFORMATION | \PhpOffice\PhpSpreadsheet\Calculation\Functions::NA
NEGBINOMDIST | CATEGORY_STATISTICAL | \PhpOffice\PhpSpreadsheet\Calculation\Statistical::NEGBINOMDIST
NETWORKDAYS | CATEGORY_DATE_AND_TIME | \PhpOffice\PhpSpreadsheet\Calculation\DateTime::NETWORKDAYS
NETWORKDAYS.INTL | CATEGORY_DATE_AND_TIME | **Not yet Implemented**
NOMINAL | CATEGORY_FINANCIAL | \PhpOffice\PhpSpreadsheet\Calculation\Financial::NOMINAL
NORMDIST | CATEGORY_STATISTICAL | \PhpOffice\PhpSpreadsheet\Calculation\Statistical::NORMDIST
NORMINV | CATEGORY_STATISTICAL | \PhpOffice\PhpSpreadsheet\Calculation\Statistical::NORMINV
@ -494,6 +501,7 @@ WEEKDAY | CATEGORY_DATE_AND_TIME | \PhpOffice\PhpSpreadsheet
WEEKNUM | CATEGORY_DATE_AND_TIME | \PhpOffice\PhpSpreadsheet\Calculation\DateTime::WEEKNUM
WEIBULL | CATEGORY_STATISTICAL | \PhpOffice\PhpSpreadsheet\Calculation\Statistical::WEIBULL
WORKDAY | CATEGORY_DATE_AND_TIME | \PhpOffice\PhpSpreadsheet\Calculation\DateTime::WORKDAY
WORKDAY.INTL | CATEGORY_DATE_AND_TIME | **Not yet Implemented**
## X

View File

@ -2,8 +2,8 @@
namespace PhpOffice\PhpSpreadsheet\Calculation;
use PhpOffice\PhpSpreadsheet\Exception as PhpSpreadsheetException;
use PhpOffice\PhpSpreadsheet\Shared\JAMA\Matrix;
use Matrix\Exception as MatrixException;
use Matrix\Matrix;
class MathTrig
{
@ -498,7 +498,7 @@ class MathTrig
if ((is_string($matrixCell)) || ($matrixCell === null)) {
return Functions::VALUE();
}
$matrixData[$column][$row] = $matrixCell;
$matrixData[$row][$column] = $matrixCell;
++$column;
}
if ($column > $maxColumn) {
@ -506,15 +506,15 @@ class MathTrig
}
++$row;
}
if ($row != $maxColumn) {
$matrix = new Matrix($matrixData);
if (!$matrix->isSquare()) {
return Functions::VALUE();
}
try {
$matrix = new Matrix($matrixData);
return $matrix->det();
} catch (PhpSpreadsheetException $ex) {
return $matrix->determinant();
} catch (MatrixException $ex) {
return Functions::VALUE();
}
}
@ -550,7 +550,7 @@ class MathTrig
if ((is_string($matrixCell)) || ($matrixCell === null)) {
return Functions::VALUE();
}
$matrixData[$column][$row] = $matrixCell;
$matrixData[$row][$column] = $matrixCell;
++$column;
}
if ($column > $maxColumn) {
@ -558,17 +558,19 @@ class MathTrig
}
++$row;
}
foreach ($matrixValues as $matrixRow) {
if (count($matrixRow) != $maxColumn) {
return Functions::VALUE();
}
$matrix = new Matrix($matrixData);
if (!$matrix->isSquare()) {
return Functions::VALUE();
}
if ($matrix->determinant() == 0.0) {
return Functions::NAN();
}
try {
$matrix = new Matrix($matrixData);
return $matrix->inverse()->getArray();
} catch (PhpSpreadsheetException $ex) {
return $matrix->inverse()->toArray();
} catch (MatrixException $ex) {
return Functions::VALUE();
}
}
@ -629,8 +631,8 @@ class MathTrig
return Functions::VALUE();
}
return $matrixA->times($matrixB)->getArray();
} catch (PhpSpreadsheetException $ex) {
return $matrixA->multiply($matrixB)->toArray();
} catch (MatrixException $ex) {
return Functions::VALUE();
}
}

View File

@ -281,10 +281,8 @@ class MathTrigTest extends TestCase
*/
public function testMINVERSE($expectedResult, ...$args)
{
$this->markTestIncomplete('TODO: This test should be fixed');
$result = MathTrig::MINVERSE(...$args);
self::assertEquals($expectedResult, $result, null, 1E-12);
self::assertEquals($expectedResult, $result, null, 1E-8);
}
public function providerMINVERSE()
@ -299,10 +297,8 @@ class MathTrigTest extends TestCase
*/
public function testMMULT($expectedResult, ...$args)
{
$this->markTestIncomplete('TODO: This test should be fixed');
$result = MathTrig::MMULT(...$args);
self::assertEquals($expectedResult, $result, null, 1E-12);
self::assertEquals($expectedResult, $result, null, 1E-8);
}
public function providerMMULT()

View File

@ -4,259 +4,109 @@ return [
[
0,
[
[
1,
2,
3,
],
[
4,
5,
6,
],
[
7,
8,
9,
],
[ 1, 2, 3 ],
[ 4, 5, 6 ],
[ 7, 8, 9 ],
],
],
[
0,
[
[
1.1,
2.2,
3.3,
],
[
4.4,
5.5,
6.6,
],
[
7.7,
8.8,
9.9,
],
[ 1.1, 2.2, 3.3 ],
[ 4.4, 5.5, 6.6 ],
[ 7.7, 8.8, 9.9 ],
],
],
[
0,
[
[
10,
20,
30,
],
[
40,
50,
60,
],
[
70,
80,
90,
],
[ 10, 20, 30 ],
[ 40, 50, 60 ],
[ 70, 80, 90 ],
],
],
[
-360.0,
[
[
8,
1,
6,
],
[
3,
5,
7,
],
[
4,
9,
2,
],
[ 8, 1, 6 ],
[ 3, 5, 7 ],
[ 4, 9, 2 ],
],
],
[
-9,
[
[
5,
2,
],
[
7,
1,
],
[ 5, 2 ],
[ 7, 1 ],
],
],
[
40,
[
[
6,
4,
2,
],
[
3,
5,
3,
],
[
2,
3,
4,
],
[ 6, 4, 2 ],
[ 3, 5, 3 ],
[ 2, 3, 4 ],
],
],
[
1.81,
[
[
0.2,
1,
],
[
0.35,
10.8,
],
],
],
[
'#VALUE!',
[
[
0.2,
1,
-0.9,
],
[
0.35,
10.8,
4,
],
[
-3.15,
5,
null,
],
[ 0.20, 1.0 ],
[ 0.35, 10.8 ],
],
],
[
-2,
[
[
1,
2,
],
[
3,
4,
],
[ 1, 2 ],
[ 3, 4 ],
],
],
[
-3,
[
[
1,
2,
1,
],
[
3,
4,
2,
],
[
1,
1,
2,
],
[ 1, 2, 1 ],
[ 3, 4, 2 ],
[ 1, 1, 2 ],
],
],
[
88,
[
[
1,
3,
8,
5,
],
[
1,
3,
6,
1,
],
[
1,
1,
1,
0,
],
[
7,
3,
10,
2,
],
[ 1, 3, 8, 5 ],
[ 1, 3, 6, 1 ],
[ 1, 1, 1, 0 ],
[ 7, 3, 10, 2 ],
],
],
[
1,
[
[
3,
6,
1,
],
[
1,
1,
0,
],
[
3,
10,
2,
],
[ 3, 6, 1 ],
[ 1, 1, 0 ],
[ 3, 10, 2 ],
],
],
[
-3,
[
[
3,
6,
],
[
1,
1,
],
[ 3, 6 ],
[ 1, 1 ],
],
],
[
'#VALUE!',
[
[
1,
3,
8,
5,
],
[
1,
3,
6,
1,
],
[ 0.20, 1.00, -0.90 ],
[ 0.35, 10.80, 4.00 ],
[ -3.15, 5.00, null ],
],
],
[
'#VALUE!',
[
[ 1, 3, 8, 5 ],
[ 1, 3, 6, 1 ],
],
],
];

View File

@ -3,409 +3,112 @@
return [
[
[
[
1,
2,
3,
],
[
4,
5,
6,
],
[
7,
8,
9,
],
[ 0.147222222222222, -0.14444444444444399, 0.063888888888888898 ],
[ -0.061111111111111102, 0.022222222222222199, 0.105555555555556 ],
[ -0.0194444444444444, 0.18888888888888899, -0.102777777777778 ],
],
[
[
-4503599627370500.0,
9007199254740990.0,
-4503599627370500.0,
],
[
9007199254741000.0,
-18014398509482000.0,
9007199254740990.0,
],
[
-4503599627370500.0,
9007199254740990.0,
-4503599627370500.0,
],
[ 8, 1, 6 ],
[ 3, 5, 7 ],
[ 4, 9, 2 ],
],
],
[
[
[
10,
20,
30,
],
[
40,
50,
60,
],
[
70,
80,
90,
],
[ 4, -1 ],
[ 2, 0 ],
],
[
[
70368744177663.898,
-140737488355328.0,
70368744177664.0,
],
[
-140737488355328.0,
281474976710656.0,
-140737488355328.0,
],
[
70368744177664.094,
-140737488355328.0,
70368744177664.0,
],
[ 0.0, 0.5 ],
[ -1.0, 2.0 ],
],
],
[
[
[
8,
1,
6,
],
[
3,
5,
7,
],
[
4,
9,
2,
],
[ 1, 2, 1 ],
[ 3, 4, -1 ],
[ 0, 2, 0 ],
],
[
[
0.147222222222222,
-0.14444444444444399,
0.063888888888888898,
],
[
-0.061111111111111102,
0.022222222222222199,
0.105555555555556,
],
[
-0.0194444444444444,
0.18888888888888899,
-0.102777777777778,
],
[ 0.25, 0.25, -0.75 ],
[ 0.00, 0.00, 0.50 ],
[ 0.75, -0.25, -0.25 ],
],
],
[
[
[
4,
-1,
],
[
2,
0,
],
[ -0.4545454545455, 1.8181818181818, 0.2727272727273, -0.4545454545455 ],
[ -0.4545454545455, 1.8181818181818, -0.7272727272727, -0.4545454545455 ],
[ 0.9090909090909, 1.3636363636364, 0.4545454545455, 0.9090909090909 ],
[ 2.2727272727273, 0.9090909090909, 5.6363636363636, 3.2727272727273 ],
],
[
[
0,
0.5,
],
[
-1,
2,
],
[ 3.2, -4.8, 2.8, -1.0 ],
[ 0.2, 0.2, 0.2, 0.0 ],
[ 1.0, -1.0, 0.0, 0.0 ],
[ -4.0, 5.0, -2.0, 1.0 ],
],
],
[
[
[
1,
2,
1,
],
[
3,
4,
-1,
],
[
0,
2,
0,
],
[ 1, 2 ],
[ 3, 4 ],
],
[
[
0.25,
0.25,
-0.75,
],
[
0,
0,
0.5,
],
[
0.75,
-0.25,
-0.25,
],
[ -2.0, 1.0 ],
[ 1.5, -0.5 ],
],
],
[
[
[
1,
4,
1,
1,
],
[
1,
4,
0,
1,
],
[
2,
3,
1,
2,
],
[
3,
2,
6,
4,
],
[ 1, 2, 1 ],
[ 3, 4, 2 ],
[ 1, 1, 2 ],
],
[
[
3.2000000000000002,
-4.7999999999999998,
2.7999999999999998,
-1,
],
[
0.20000000000000001,
0.20000000000000001,
0.20000000000000001,
0,
],
[
1,
-1,
0,
0,
],
[
-4,
5,
-2,
1,
],
[ -2, 1, 0 ],
[ 1.3333333333333299, -0.33333333333332998, -0.33333333333332998 ],
[ 0.33333333333332998, -0.33333333333332998, 0.66666666666666996 ],
],
],
[
[
[
0.20000000000000001,
1,
],
[
0.34999999999999998,
10.800000000000001,
],
[ 2, 3 ],
[ 4, 5 ],
],
[
[
5.9668508287292799,
-0.55248618784530001,
],
[
-0.19337016574586,
0.11049723756906001,
],
[ -2.5, 1.5 ],
[ 2.0, -1.0 ],
],
],
[
[
[
0.20000000000000001,
1,
-0.90000000000000002,
],
[
0.34999999999999998,
10.800000000000001,
4,
],
[
-3.1499999999999999,
5,
],
],
'#VALUE!',
],
[
[
[
1,
2,
],
[
3,
4,
],
[ 5, 8 ],
[ 7, 9 ],
],
[
[
-2,
1,
],
[
1.5,
-0.5,
],
[ -0.81818181818181801, 0.72727272727272696 ],
[ 0.63636363636363602, -0.45454545454545497 ],
],
],
[
[
[
1,
2,
1,
],
[
3,
4,
2,
],
[
1,
1,
2,
],
[ 45, 78 ],
[ 17, 50 ],
],
[
[
-2,
1,
0,
],
[
1.3333333333333299,
-0.33333333333332998,
-0.33333333333332998,
],
[
0.33333333333332998,
-0.33333333333332998,
0.66666666666666996,
],
[ 0.054112554112554001, -0.084415584415584 ],
[ -0.018398268398268001, 0.048701298701299002 ],
],
],
[
[
[
2,
3,
],
[
4,
5,
],
[ 2, 2 ],
[ 2, 1 ],
],
[
[
-2.5,
1.5,
],
[
2,
-1,
],
],
],
[
[
[
5,
8,
],
[
7,
9,
],
],
[
[
-0.81818181818181801,
0.72727272727272696,
],
[
0.63636363636363602,
-0.45454545454545497,
],
],
],
[
[
[
45,
78,
],
[
17,
50,
],
],
[
[
0.054112554112554001,
-0.084415584415584,
],
[
-0.018398268398268001,
0.048701298701299002,
],
],
],
[
[
[
2,
2,
],
[
2,
1,
],
],
[
[
-0.5,
1.0,
],
[
1,
-1,
],
[ -0.5, 1.0 ],
[ 1.0, -1.0 ],
],
],
];

View File

@ -3,303 +3,113 @@
return [
[
[
[
1,
2,
],
[
3,
4,
],
[ 7, 10 ],
[ 15, 22 ],
],
[
[
1,
2,
],
[
3,
4,
],
[ 1, 2 ],
[ 3, 4 ],
],
[
[
7,
10,
],
[
15,
22,
],
[ 1, 2 ],
[ 3, 4 ],
],
],
[
[
[
1,
2,
3,
],
[
4,
5,
6,
],
[
7,
8,
9,
],
[ 30, 36, 42 ],
[ 66, 81, 96 ],
[ 102, 126, 150 ],
],
[
[
1,
2,
3,
],
[
4,
5,
6,
],
[
7,
8,
9,
],
[ 1, 2, 3 ],
[ 4, 5, 6 ],
[ 7, 8, 9 ],
],
[
[
30,
36,
42,
],
[
66,
81,
96,
],
[
102,
126,
150,
],
[ 1, 2, 3 ],
[ 4, 5, 6 ],
[ 7, 8, 9 ],
],
],
// Mismatched dimensions
[
[
[
1,
2,
],
[
3,
4,
],
[ 10.08, 14.40 ],
[ 21.60, 31.68 ],
],
2,
[
[ 1.2, 2.4 ],
[ 3.6, 4.8 ],
],
[
[ 1.2, 2.4 ],
[ 3.6, 4.8 ],
],
],
[
[
[ 20.48, 30.60 ],
[ 50.40, 79.88 ],
],
[
[ 1.2, 3.4 ],
[ 5.6, 7.8 ],
],
[
[ 1.2, 3.4 ],
[ 5.6, 7.8 ],
],
],
[
[
[ 62.00, 49.46 ],
[ 176.40, 144.50 ],
],
[
[ 1.2, 2.3, 3.4, 4.5 ],
[ 5.6, 6.7, 7.8, 8.9 ],
],
[
[ 9.8, 8.7 ],
[ 7.6, 6.5 ],
[ 5.4, 4.3 ],
[ 3.2, 2.1 ],
],
],
[
[
[ 17 ],
[ 39 ],
],
[
[ 1, 2 ],
[ 3, 4 ],
],
[
[ 5 ],
[ 6 ],
]
],
// Mismatched dimensions (2x2) and (1x1)
[
'#VALUE!',
],
// Mismatched dimensions
[
[
[
1,
2,
],
[
3,
4,
],
[ 1, 2 ],
[ 3, 4 ],
],
[
[ 2 ]
],
],
// Mismatched dimensions (2x2) and individual cell
[
'#VALUE!',
[
[ 1, 2 ],
[ 3, 4 ],
],
[
2,
],
'#VALUE!',
],
[
[
1.2,
2.3999999999999999,
],
[
[
3.6000000000000001,
4.5,
],
],
[
[
14.43,
14.43,
],
[
14.43,
14.43,
],
],
],
// Mismatched dimensions
[
2,
[
[
1,
2,
],
[
3,
4,
],
],
'#VALUE!',
],
// Mismatched dimensions
[
[
2,
],
[
[
1,
2,
],
[
3,
4,
],
],
'#VALUE!',
],
[
[
[
1,
2,
],
[
3,
4,
],
],
[
[
2,
4,
],
],
'#VALUE!',
],
[
[
[
1,
2,
],
[
3,
4,
],
],
[
2,
4,
],
[
[
10,
],
[
22,
],
],
],
[
[
[
2,
4,
],
],
[
[
1,
2,
],
[
3,
4,
],
],
[
[
14,
20,
],
],
],
// Mismatched dimensions
[
[
2,
4,
],
[
[
1,
2,
],
[
3,
4,
],
],
'#VALUE!',
],
[
[
[
1,
2,
],
[
3,
4,
],
[
5,
6,
],
],
[
[
1,
2,
3,
],
[
4,
5,
6,
],
],
[
[
9,
12,
15,
],
[
19,
26,
33,
],
[
29,
40,
51,
],
],
],
];