@@ -146,44 +146,31 @@ object DoubleMatrix:
146146 val newArr = vecxt.arrays.* (m.raw)(m2.raw)
147147 Matrix [Double ](newArr, m.rows, m.cols, m.rowStride, m.colStride, m.offset)(using BoundsCheck .DoBoundsCheck .no)
148148 else
149- // Different memory layouts: materialize only one matrix and multiply in-place
150- // Choose which matrix to materialize based on which is already dense column-major
149+ // Different memory layouts: materialize one matrix to match the other's layout
151150 if m.isDenseColMajor then
152- // m is already dense, materialize m2 and multiply in-place
153- val m2Dense = m2.deepCopy
154- // Multiply m2Dense in-place with m
155- var idx = 0
156- var j = 0
157- while j < m.cols do
158- var i = 0
159- while i < m.rows do
160- m2Dense.raw(idx) = m2Dense.raw(idx) * m(i, j)
161- i += 1
162- idx += 1
163- end while
164- j += 1
165- end while
151+ // m is dense column-major, materialize m2 to column-major and multiply in-place
152+ val m2Dense = m2.deepCopy(asRowMajor = false )
153+ vecxt.arrays.*= (m2Dense.raw)(m.raw)
154+ m2Dense
155+ else if m.isDenseRowMajor then
156+ // m is dense row-major, materialize m2 to row-major and multiply in-place
157+ val m2Dense = m2.deepCopy(asRowMajor = true )
158+ vecxt.arrays.*= (m2Dense.raw)(m.raw)
166159 m2Dense
167160 else if m2.isDenseColMajor then
168- // m2 is already dense, materialize m and multiply in-place
169- val mDense = m.deepCopy
170- // Multiply mDense in-place with m2
171- var idx = 0
172- var j = 0
173- while j < m.cols do
174- var i = 0
175- while i < m.rows do
176- mDense.raw(idx) = mDense.raw(idx) * m2(i, j)
177- i += 1
178- idx += 1
179- end while
180- j += 1
181- end while
161+ // m2 is dense column-major, materialize m to column-major and multiply in-place
162+ val mDense = m.deepCopy(asRowMajor = false )
163+ vecxt.arrays.*= (mDense.raw)(m2.raw)
164+ mDense
165+ else if m2.isDenseRowMajor then
166+ // m2 is dense row-major, materialize m to row-major and multiply in-place
167+ val mDense = m.deepCopy(asRowMajor = true )
168+ vecxt.arrays.*= (mDense.raw)(m2.raw)
182169 mDense
183170 else
184- // Neither is dense column-major , materialize m and use SIMD multiplication
185- val mDense = m.deepCopy
186- val m2Dense = m2.deepCopy
171+ // Neither is dense, materialize both to column-major and use SIMD multiplication
172+ val mDense = m.deepCopy(asRowMajor = false )
173+ val m2Dense = m2.deepCopy(asRowMajor = false )
187174 val newArr = vecxt.arrays.* (mDense.raw)(m2Dense.raw)
188175 Matrix [Double ](newArr, m.rows, m.cols)(using BoundsCheck .DoBoundsCheck .no)
189176 end if
0 commit comments