Skip to content

Commit b003d38

Browse files
committed
Eliminate recursive generators
1 parent e84ade6 commit b003d38

File tree

1 file changed

+26
-20
lines changed

1 file changed

+26
-20
lines changed

src/type/matrix/DenseMatrix.js

Lines changed: 26 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -665,34 +665,40 @@ export const createDenseMatrixClass = /* #__PURE__ */ factory(name, dependencies
665665
* @return {Iterable<{ value, index: number[] }>}
666666
*/
667667
DenseMatrix.prototype[Symbol.iterator] = function * () {
668-
const maxDepth = this._size.length - 1
668+
const size = this._size
669+
const data = this._data
670+
const dims = size.length
669671

670-
if (maxDepth < 0) {
671-
return
672-
}
672+
// No elements if no dimensions
673+
if (dims === 0) return
673674

674-
if (maxDepth === 0) {
675-
for (let i = 0; i < this._data.length; i++) {
676-
yield ({ value: this._data[i], index: [i] })
675+
// 1D matrix: yield each element with its index
676+
if (dims === 1) {
677+
for (let i = 0; i < size[0]; i++) {
678+
yield { value: data[i], index: [i] }
677679
}
678680
return
679681
}
680682

681-
const index = []
682-
const recurse = function * (value, depth) {
683-
if (depth < maxDepth) {
684-
for (let i = 0; i < value.length; i++) {
685-
index[depth] = i
686-
yield * recurse(value[i], depth + 1)
687-
}
688-
} else {
689-
for (let i = 0; i < value.length; i++) {
690-
index[depth] = i
691-
yield ({ value: value[i], index: index.slice() })
692-
}
683+
// Multi-dimensional matrix: iterate over all elements
684+
const index = Array(dims).fill(0)
685+
const totalElements = size.reduce((a, b) => a * b, 1)
686+
687+
for (let count = 0; count < totalElements; count++) {
688+
// Traverse to the current element using indices
689+
let current = data
690+
for (let d = 0; d < dims - 1; d++) {
691+
current = current[index[d]]
692+
}
693+
yield { value: current[index[dims - 1]], index: index.slice() }
694+
695+
// Increment indices for next element
696+
for (let d = dims - 1; d >= 0; d--) {
697+
index[d]++
698+
if (index[d] < size[d]) break
699+
index[d] = 0
693700
}
694701
}
695-
yield * recurse(this._data, 0)
696702
}
697703

698704
/**

0 commit comments

Comments
 (0)