001    /*
002     * Licensed to the Apache Software Foundation (ASF) under one or more
003     * contributor license agreements.  See the NOTICE file distributed with
004     * this work for additional information regarding copyright ownership.
005     * The ASF licenses this file to You under the Apache License, Version 2.0
006     * (the "License"); you may not use this file except in compliance with
007     * the License.  You may obtain a copy of the License at
008     *
009     *      http://www.apache.org/licenses/LICENSE-2.0
010     *
011     * Unless required by applicable law or agreed to in writing, software
012     * distributed under the License is distributed on an "AS IS" BASIS,
013     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014     * See the License for the specific language governing permissions and
015     * limitations under the License.
016     */
017    
018    package org.apache.commons.math.linear;
019    
020    import org.apache.commons.math.exception.DimensionMismatchException;
021    import org.apache.commons.math.exception.NullArgumentException;
022    import org.apache.commons.math.exception.OutOfRangeException;
023    import org.apache.commons.math.exception.ZeroException;
024    
025    /**
026     * Interface defining a real-valued matrix with basic algebraic operations.
027     * <p>
028     * Matrix element indexing is 0-based -- e.g., <code>getEntry(0, 0)</code>
029     * returns the element in the first row, first column of the matrix.</p>
030     *
031     * @version $Id: RealMatrix.java 1165822 2011-09-06 20:19:37Z luc $
032     */
033    public interface RealMatrix extends AnyMatrix {
034        /**
035         * Create a new RealMatrix of the same type as the instance with the supplied
036         * row and column dimensions.
037         *
038         * @param rowDimension  the number of rows in the new matrix
039         * @param columnDimension  the number of columns in the new matrix
040         * @return a new matrix of the same type as the instance
041         * @throws org.apache.commons.math.exception.NotStrictlyPositiveException
042         * if row or column dimension is not positive.
043         * @since 2.0
044         */
045        RealMatrix createMatrix(final int rowDimension, final int columnDimension);
046    
047        /**
048         * Returns a (deep) copy of this.
049         *
050         * @return matrix copy
051         */
052        RealMatrix copy();
053    
054        /**
055         * Compute the sum of this and m.
056         *
057         * @param m    matrix to be added
058         * @return     this + m
059         * @throws  IllegalArgumentException if m is not the same size as this
060         */
061        RealMatrix add(RealMatrix m);
062    
063        /**
064         * Compute this minus m.
065         *
066         * @param m    matrix to be subtracted
067         * @return     this - m
068         * @throws  IllegalArgumentException if m is not the same size as this
069         */
070        RealMatrix subtract(RealMatrix m);
071    
072         /**
073         * Returns the result of adding d to each entry of this.
074         *
075         * @param d    value to be added to each entry
076         * @return     d + this
077         */
078        RealMatrix scalarAdd(double d);
079    
080        /**
081         * Returns the result multiplying each entry of this by d.
082         *
083         * @param d    value to multiply all entries by
084         * @return     d * this
085         */
086        RealMatrix scalarMultiply(double d);
087    
088        /**
089         * Returns the result of postmultiplying this by m.
090         *
091         * @param m    matrix to postmultiply by
092         * @return     this * m
093         * @throws     IllegalArgumentException
094         *             if columnDimension(this) != rowDimension(m)
095         */
096        RealMatrix multiply(RealMatrix m);
097    
098        /**
099         * Returns the result premultiplying this by <code>m</code>.
100         * @param m    matrix to premultiply by
101         * @return     m * this
102         * @throws     IllegalArgumentException
103         *             if rowDimension(this) != columnDimension(m)
104         */
105        RealMatrix preMultiply(RealMatrix m);
106    
107        /**
108         * Returns the result multiplying this with itself <code>p</code> times.
109         * Depending on the underlying storage, instability for high powers might occur.
110         * @param      p raise this to power p
111         * @return     this^p
112         * @throws     IllegalArgumentException if p < 0
113         *             NonSquareMatrixException if the matrix is not square
114         */
115        RealMatrix power(final int p);
116    
117        /**
118         * Returns matrix entries as a two-dimensional array.
119         *
120         * @return    2-dimensional array of entries
121         */
122        double[][] getData();
123    
124        /**
125         * Returns the <a href="http://mathworld.wolfram.com/MaximumAbsoluteRowSumNorm.html">
126         * maximum absolute row sum norm</a> of the matrix.
127         *
128         * @return norm
129         */
130        double getNorm();
131    
132        /**
133         * Returns the <a href="http://mathworld.wolfram.com/FrobeniusNorm.html">
134         * Frobenius norm</a> of the matrix.
135         *
136         * @return norm
137         */
138        double getFrobeniusNorm();
139    
140        /**
141         * Gets a submatrix. Rows and columns are indicated
142         * counting from 0 to n-1.
143         *
144         * @param startRow Initial row index
145         * @param endRow Final row index (inclusive)
146         * @param startColumn Initial column index
147         * @param endColumn Final column index (inclusive)
148         * @return The subMatrix containing the data of the
149         *         specified rows and columns
150         * @throws org.apache.commons.math.exception.OutOfRangeException if
151         * the indices are not valid.
152         */
153        RealMatrix getSubMatrix(int startRow, int endRow, int startColumn, int endColumn);
154    
155       /**
156        * Gets a submatrix. Rows and columns are indicated
157        * counting from 0 to n-1.
158        *
159        * @param selectedRows Array of row indices.
160        * @param selectedColumns Array of column indices.
161        * @return The subMatrix containing the data in the
162        *         specified rows and columns
163        * @throws org.apache.commons.math.exception.OutOfRangeException if
164        * the indices are not valid.
165        */
166        RealMatrix getSubMatrix(int[] selectedRows, int[] selectedColumns);
167    
168       /**
169        * Copy a submatrix. Rows and columns are indicated
170        * counting from 0 to n-1.
171        *
172        * @param startRow Initial row index
173        * @param endRow Final row index (inclusive)
174        * @param startColumn Initial column index
175        * @param endColumn Final column index (inclusive)
176        * @param destination The arrays where the submatrix data should be copied
177        * (if larger than rows/columns counts, only the upper-left part will be used)
178        * @throws org.apache.commons.math.exception.OutOfRangeException if the
179        * indices are not valid.
180        * @exception IllegalArgumentException if the destination array is too small
181        */
182        void copySubMatrix(int startRow, int endRow, int startColumn, int endColumn,
183                           double[][] destination);
184        /**
185         * Copy a submatrix. Rows and columns are indicated
186         * counting from 0 to n-1.
187         *
188         * @param selectedRows Array of row indices.
189         * @param selectedColumns Array of column indices.
190         * @param destination The arrays where the submatrix data should be copied
191         * (if larger than rows/columns counts, only the upper-left part will be used)
192         * @throws org.apache.commons.math.exception.OutOfRangeException if the
193         * indices are not valid.
194         * @exception IllegalArgumentException if the destination array is too small
195         */
196        void copySubMatrix(int[] selectedRows, int[] selectedColumns, double[][] destination);
197    
198       /**
199        * Replace the submatrix starting at <code>row, column</code> using data in
200        * the input <code>subMatrix</code> array. Indexes are 0-based.
201        * <p>
202        * Example:<br>
203        * Starting with <pre>
204        * 1  2  3  4
205        * 5  6  7  8
206        * 9  0  1  2
207        * </pre>
208        * and <code>subMatrix = {{3, 4} {5,6}}</code>, invoking
209        * <code>setSubMatrix(subMatrix,1,1))</code> will result in <pre>
210        * 1  2  3  4
211        * 5  3  4  8
212        * 9  5  6  2
213        * </pre></p>
214        *
215        * @param subMatrix  array containing the submatrix replacement data
216        * @param row  row coordinate of the top, left element to be replaced
217        * @param column  column coordinate of the top, left element to be replaced
218        * @throws ZeroException if {@code subMatrix} does not contain at least one column.
219        * @throws OutOfRangeException if {@code subMatrix} does not fit into
220        * this matrix from element in {@code (row, column)}.
221        * @throws DimensionMismatchException if {@code subMatrix} is not rectangular.
222        * (not all rows have the same length) or empty.
223        * @throws NullArgumentException if {@code subMatrix} is {@code null}.
224        * @since 2.0
225        */
226        void setSubMatrix(double[][] subMatrix, int row, int column)
227            throws ZeroException, OutOfRangeException, DimensionMismatchException, NullArgumentException;
228    
229       /**
230        * Geet the entries at the given row index
231        * as a row matrix.  Row indices start at 0.
232        *
233        * @param row Row to be fetched.
234        * @return row Matrix.
235        * @throws org.apache.commons.math.exception.OutOfRangeException if
236        * the specified row index is invalid.
237        */
238       RealMatrix getRowMatrix(int row);
239    
240       /**
241        * Set the entries at the given row index
242        * as a row matrix.  Row indices start at 0.
243        *
244        * @param row Row to be set.
245        * @param matrix Row matrix (must have one row and the same number of
246        * columns as the instance).
247        * @throws org.apache.commons.math.exception.OutOfRangeException if the
248        * specified row index is invalid.
249        * @throws MatrixDimensionMismatchException
250        * if the matrix dimensions do not match one instance row.
251        */
252        void setRowMatrix(int row, RealMatrix matrix);
253    
254       /**
255        * Get the entries at the given column index
256        * as a column matrix.  Column indices start at 0.
257        *
258        * @param column Column to be fetched.
259        * @return column Matrix.
260        * @throws org.apache.commons.math.exception.OutOfRangeException if
261        * the specified column index is invalid.
262        */
263       RealMatrix getColumnMatrix(int column);
264    
265       /**
266        * Set the entries at the given column index
267        * as a column matrix.  Column indices start at 0.
268        *
269        * @param column Column to be set.
270        * @param matrix Column matrix (must have one column and the same number
271        * of rows as the instance).
272        * @throws org.apache.commons.math.exception.OutOfRangeException if
273        * the specified column index is invalid.
274        * @throws MatrixDimensionMismatchException
275        * if the {@code matrix} dimensions do not match one instance column.
276        */
277        void setColumnMatrix(int column, RealMatrix matrix);
278    
279       /**
280        * Returns the entries in row number <code>row</code>
281        * as a vector.  Row indices start at 0.
282        *
283        * @param row Row to be fetched.
284        * @return a row vector.
285        * @throws org.apache.commons.math.exception.OutOfRangeException if
286        * the specified row index is invalid.
287        */
288       RealVector getRowVector(int row);
289    
290       /**
291        * Set the entries at the given row index.
292        * as a vector.  Row indices start at 0.
293        *
294        * @param row Row to be set.
295        * @param vector row vector (must have the same number of columns
296        * as the instance).
297        * @throws org.apache.commons.math.exception.OutOfRangeException if
298        * the specified row index is invalid.
299        * @throws MatrixDimensionMismatchException
300        * if the vector dimension does not match one instance row.
301        */
302        void setRowVector(int row, RealVector vector);
303    
304       /**
305        * Get the entries at the given column index
306        * as a vector.  Column indices start at 0.
307        *
308        * @param column Column to be fetched.
309        * @return a column vector.
310        * @throws org.apache.commons.math.exception.OutOfRangeException if
311        * the specified column index is invalid
312        */
313       RealVector getColumnVector(int column);
314    
315       /**
316        * Set the entries at the given column index
317        * as a vector.  Column indices start at 0.
318        *
319        * @param column Column to be set.
320        * @param vector column vector (must have the same number of rows as
321        * the instance).
322        * @throws org.apache.commons.math.exception.OutOfRangeException if the
323        * specified column index is invalid.
324        * @throws MatrixDimensionMismatchException
325        * if the vector dimension does not match one instance column.
326        */
327        void setColumnVector(int column, RealVector vector);
328    
329        /**
330         * Get the entries at the given row index.
331         * Row indices start at 0.
332         *
333         * @param row Row to be fetched.
334         * @return the array of entries in the row.
335         * @throws org.apache.commons.math.exception.OutOfRangeException if the
336         * specified row index is not valid.
337         */
338        double[] getRow(int row);
339    
340        /**
341         * Set the entries at the given row index
342         * as a row matrix.  Row indices start at 0.
343         *
344         * @param row Row to be set.
345         * @param array Row matrix (must have the same number of columns as
346         * the instance)
347         * @throws org.apache.commons.math.exception.OutOfRangeException if the
348         * specified row index is invalid.
349         * @throws MatrixDimensionMismatchException
350         * if the array size does not match one instance row.
351         */
352        void setRow(int row, double[] array);
353    
354        /**
355         * Get the entries at the given column index as an array.
356         * Column indices start at 0.
357         *
358         * @param column Column to be fetched.
359         * @return the array of entries in the column.
360         * @throws org.apache.commons.math.exception.OutOfRangeException if the
361         * specified column index is not valid.
362         */
363        double[] getColumn(int column);
364    
365        /**
366         * Set the entries at the given column index
367         * as a column matrix array.  Column indices start at 0.
368         *
369         * @param column Column to be set.
370         * @param array Column array (must have the same number of rows as
371         * the instance).
372         * @throws org.apache.commons.math.exception.OutOfRangeException if the
373         * specified column index is invalid.
374         * @throws MatrixDimensionMismatchException
375         * if the array size does not match one instance column.
376         */
377        void setColumn(int column, double[] array);
378    
379        /**
380         * Get the entry in the specified row and column.
381         * Row and column indices start at 0.
382         *
383         * @param row Row location of entry to be fetched.
384         * @param column Column location of entry to be fetched.
385         * @return the matrix entry at {@code (row, column)}.
386         * @throws org.apache.commons.math.exception.OutOfRangeException if the
387         * row or column index is not valid.
388         */
389        double getEntry(int row, int column);
390    
391        /**
392         * Set the entry in the specified row and column.
393         * Row and column indices start at 0.
394         *
395         * @param row Row location of entry to be set.
396         * @param column Column location of entry to be set.
397         * @param value matrix entry to be set.
398         * @throws org.apache.commons.math.exception.OutOfRangeException if
399         * the row or column index is not valid
400         * @since 2.0
401         */
402        void setEntry(int row, int column, double value);
403    
404        /**
405         * Change an entry in the specified row and column.
406         * Row and column indices start at 0.
407         *
408         * @param row Row location of entry to be set.
409         * @param column Column location of entry to be set.
410         * @param increment value to add to the matrix entry.
411         * @throws org.apache.commons.math.exception.OutOfRangeException if
412         * the row or column index is not valid.
413         * @since 2.0
414         */
415        void addToEntry(int row, int column, double increment);
416    
417        /**
418         * Change an entry in the specified row and column.
419         * Row and column indices start at 0.
420         *
421         * @param row Row location of entry to be set.
422         * @param column Column location of entry to be set.
423         * @param factor Multiplication factor for the matrix entry.
424         * @throws org.apache.commons.math.exception.OutOfRangeException if
425         * the row or column index is not valid.
426         * @since 2.0
427         */
428        void multiplyEntry(int row, int column, double factor);
429    
430        /**
431         * Returns the transpose of this matrix.
432         *
433         * @return transpose matrix
434         */
435        RealMatrix transpose();
436    
437        /**
438         * Returns the <a href="http://mathworld.wolfram.com/MatrixTrace.html">
439         * trace</a> of the matrix (the sum of the elements on the main diagonal).
440         *
441         * @return the trace.
442         * @throws NonSquareMatrixException
443         * if the matrix is not square.
444         */
445        double getTrace();
446    
447        /**
448         * Returns the result of multiplying this by the vector <code>v</code>.
449         *
450         * @param v the vector to operate on
451         * @return this*v
452         * @throws IllegalArgumentException if columnDimension != v.size()
453         */
454        double[] operate(double[] v);
455    
456        /**
457         * Returns the result of multiplying this by the vector <code>v</code>.
458         *
459         * @param v the vector to operate on
460         * @return this*v
461         * @throws IllegalArgumentException if columnDimension != v.size()
462         */
463        RealVector operate(RealVector v);
464    
465        /**
466         * Returns the (row) vector result of premultiplying this by the vector <code>v</code>.
467         *
468         * @param v the row vector to premultiply by
469         * @return v*this
470         * @throws IllegalArgumentException if rowDimension != v.size()
471         */
472        double[] preMultiply(double[] v);
473    
474        /**
475         * Returns the (row) vector result of premultiplying this by the vector <code>v</code>.
476         *
477         * @param v the row vector to premultiply by
478         * @return v*this
479         * @throws IllegalArgumentException if rowDimension != v.size()
480         */
481        RealVector preMultiply(RealVector v);
482    
483        /**
484         * Visit (and possibly change) all matrix entries in row order.
485         * <p>Row order starts at upper left and iterating through all elements
486         * of a row from left to right before going to the leftmost element
487         * of the next row.</p>
488         * @param visitor visitor used to process all matrix entries
489         * @see #walkInRowOrder(RealMatrixPreservingVisitor)
490         * @see #walkInRowOrder(RealMatrixChangingVisitor, int, int, int, int)
491         * @see #walkInRowOrder(RealMatrixPreservingVisitor, int, int, int, int)
492         * @see #walkInColumnOrder(RealMatrixChangingVisitor)
493         * @see #walkInColumnOrder(RealMatrixPreservingVisitor)
494         * @see #walkInColumnOrder(RealMatrixChangingVisitor, int, int, int, int)
495         * @see #walkInColumnOrder(RealMatrixPreservingVisitor, int, int, int, int)
496         * @see #walkInOptimizedOrder(RealMatrixChangingVisitor)
497         * @see #walkInOptimizedOrder(RealMatrixPreservingVisitor)
498         * @see #walkInOptimizedOrder(RealMatrixChangingVisitor, int, int, int, int)
499         * @see #walkInOptimizedOrder(RealMatrixPreservingVisitor, int, int, int, int)
500         * @return the value returned by {@link RealMatrixChangingVisitor#end()} at the end
501         * of the walk
502         */
503        double walkInRowOrder(RealMatrixChangingVisitor visitor);
504    
505        /**
506         * Visit (but don't change) all matrix entries in row order.
507         * <p>Row order starts at upper left and iterating through all elements
508         * of a row from left to right before going to the leftmost element
509         * of the next row.</p>
510         * @param visitor visitor used to process all matrix entries
511         * @see #walkInRowOrder(RealMatrixChangingVisitor)
512         * @see #walkInRowOrder(RealMatrixChangingVisitor, int, int, int, int)
513         * @see #walkInRowOrder(RealMatrixPreservingVisitor, int, int, int, int)
514         * @see #walkInColumnOrder(RealMatrixChangingVisitor)
515         * @see #walkInColumnOrder(RealMatrixPreservingVisitor)
516         * @see #walkInColumnOrder(RealMatrixChangingVisitor, int, int, int, int)
517         * @see #walkInColumnOrder(RealMatrixPreservingVisitor, int, int, int, int)
518         * @see #walkInOptimizedOrder(RealMatrixChangingVisitor)
519         * @see #walkInOptimizedOrder(RealMatrixPreservingVisitor)
520         * @see #walkInOptimizedOrder(RealMatrixChangingVisitor, int, int, int, int)
521         * @see #walkInOptimizedOrder(RealMatrixPreservingVisitor, int, int, int, int)
522         * @return the value returned by {@link RealMatrixPreservingVisitor#end()} at the end
523         * of the walk
524         */
525        double walkInRowOrder(RealMatrixPreservingVisitor visitor);
526    
527        /**
528         * Visit (and possibly change) some matrix entries in row order.
529         * <p>Row order starts at upper left and iterating through all elements
530         * of a row from left to right before going to the leftmost element
531         * of the next row.</p>
532         * @param visitor visitor used to process all matrix entries
533         * @param startRow Initial row index
534         * @param endRow Final row index (inclusive)
535         * @param startColumn Initial column index
536         * @param endColumn Final column index
537         * @throws org.apache.commons.math.exception.OutOfRangeException if
538         * the indices are not valid.
539         * @see #walkInRowOrder(RealMatrixChangingVisitor)
540         * @see #walkInRowOrder(RealMatrixPreservingVisitor)
541         * @see #walkInRowOrder(RealMatrixPreservingVisitor, int, int, int, int)
542         * @see #walkInColumnOrder(RealMatrixChangingVisitor)
543         * @see #walkInColumnOrder(RealMatrixPreservingVisitor)
544         * @see #walkInColumnOrder(RealMatrixChangingVisitor, int, int, int, int)
545         * @see #walkInColumnOrder(RealMatrixPreservingVisitor, int, int, int, int)
546         * @see #walkInOptimizedOrder(RealMatrixChangingVisitor)
547         * @see #walkInOptimizedOrder(RealMatrixPreservingVisitor)
548         * @see #walkInOptimizedOrder(RealMatrixChangingVisitor, int, int, int, int)
549         * @see #walkInOptimizedOrder(RealMatrixPreservingVisitor, int, int, int, int)
550         * @return the value returned by {@link RealMatrixChangingVisitor#end()} at the end
551         * of the walk
552         */
553        double walkInRowOrder(RealMatrixChangingVisitor visitor,
554                              int startRow, int endRow, int startColumn, int endColumn);
555    
556        /**
557         * Visit (but don't change) some matrix entries in row order.
558         * <p>Row order starts at upper left and iterating through all elements
559         * of a row from left to right before going to the leftmost element
560         * of the next row.</p>
561         * @param visitor visitor used to process all matrix entries
562         * @param startRow Initial row index
563         * @param endRow Final row index (inclusive)
564         * @param startColumn Initial column index
565         * @param endColumn Final column index
566         * @throws org.apache.commons.math.exception.OutOfRangeException if
567         * the indices are not valid.
568         * @see #walkInRowOrder(RealMatrixChangingVisitor)
569         * @see #walkInRowOrder(RealMatrixPreservingVisitor)
570         * @see #walkInRowOrder(RealMatrixChangingVisitor, int, int, int, int)
571         * @see #walkInColumnOrder(RealMatrixChangingVisitor)
572         * @see #walkInColumnOrder(RealMatrixPreservingVisitor)
573         * @see #walkInColumnOrder(RealMatrixChangingVisitor, int, int, int, int)
574         * @see #walkInColumnOrder(RealMatrixPreservingVisitor, int, int, int, int)
575         * @see #walkInOptimizedOrder(RealMatrixChangingVisitor)
576         * @see #walkInOptimizedOrder(RealMatrixPreservingVisitor)
577         * @see #walkInOptimizedOrder(RealMatrixChangingVisitor, int, int, int, int)
578         * @see #walkInOptimizedOrder(RealMatrixPreservingVisitor, int, int, int, int)
579         * @return the value returned by {@link RealMatrixPreservingVisitor#end()} at the end
580         * of the walk
581         */
582        double walkInRowOrder(RealMatrixPreservingVisitor visitor,
583                              int startRow, int endRow, int startColumn, int endColumn);
584    
585        /**
586         * Visit (and possibly change) all matrix entries in column order.
587         * <p>Column order starts at upper left and iterating through all elements
588         * of a column from top to bottom before going to the topmost element
589         * of the next column.</p>
590         * @param visitor visitor used to process all matrix entries
591         * @see #walkInRowOrder(RealMatrixChangingVisitor)
592         * @see #walkInRowOrder(RealMatrixPreservingVisitor)
593         * @see #walkInRowOrder(RealMatrixChangingVisitor, int, int, int, int)
594         * @see #walkInRowOrder(RealMatrixPreservingVisitor, int, int, int, int)
595         * @see #walkInColumnOrder(RealMatrixPreservingVisitor)
596         * @see #walkInColumnOrder(RealMatrixChangingVisitor, int, int, int, int)
597         * @see #walkInColumnOrder(RealMatrixPreservingVisitor, int, int, int, int)
598         * @see #walkInOptimizedOrder(RealMatrixChangingVisitor)
599         * @see #walkInOptimizedOrder(RealMatrixPreservingVisitor)
600         * @see #walkInOptimizedOrder(RealMatrixChangingVisitor, int, int, int, int)
601         * @see #walkInOptimizedOrder(RealMatrixPreservingVisitor, int, int, int, int)
602         * @return the value returned by {@link RealMatrixChangingVisitor#end()} at the end
603         * of the walk
604         */
605        double walkInColumnOrder(RealMatrixChangingVisitor visitor);
606    
607        /**
608         * Visit (but don't change) all matrix entries in column order.
609         * <p>Column order starts at upper left and iterating through all elements
610         * of a column from top to bottom before going to the topmost element
611         * of the next column.</p>
612         * @param visitor visitor used to process all matrix entries
613         * @see #walkInRowOrder(RealMatrixChangingVisitor)
614         * @see #walkInRowOrder(RealMatrixPreservingVisitor)
615         * @see #walkInRowOrder(RealMatrixChangingVisitor, int, int, int, int)
616         * @see #walkInRowOrder(RealMatrixPreservingVisitor, int, int, int, int)
617         * @see #walkInColumnOrder(RealMatrixChangingVisitor)
618         * @see #walkInColumnOrder(RealMatrixChangingVisitor, int, int, int, int)
619         * @see #walkInColumnOrder(RealMatrixPreservingVisitor, int, int, int, int)
620         * @see #walkInOptimizedOrder(RealMatrixChangingVisitor)
621         * @see #walkInOptimizedOrder(RealMatrixPreservingVisitor)
622         * @see #walkInOptimizedOrder(RealMatrixChangingVisitor, int, int, int, int)
623         * @see #walkInOptimizedOrder(RealMatrixPreservingVisitor, int, int, int, int)
624         * @return the value returned by {@link RealMatrixPreservingVisitor#end()} at the end
625         * of the walk
626         */
627        double walkInColumnOrder(RealMatrixPreservingVisitor visitor);
628    
629        /**
630         * Visit (and possibly change) some matrix entries in column order.
631         * <p>Column order starts at upper left and iterating through all elements
632         * of a column from top to bottom before going to the topmost element
633         * of the next column.</p>
634         * @param visitor visitor used to process all matrix entries
635         * @param startRow Initial row index
636         * @param endRow Final row index (inclusive)
637         * @param startColumn Initial column index
638         * @param endColumn Final column index
639         * @throws org.apache.commons.math.exception.OutOfRangeException if
640         * the indices are not valid.
641         * @see #walkInRowOrder(RealMatrixChangingVisitor)
642         * @see #walkInRowOrder(RealMatrixPreservingVisitor)
643         * @see #walkInRowOrder(RealMatrixChangingVisitor, int, int, int, int)
644         * @see #walkInRowOrder(RealMatrixPreservingVisitor, int, int, int, int)
645         * @see #walkInColumnOrder(RealMatrixChangingVisitor)
646         * @see #walkInColumnOrder(RealMatrixPreservingVisitor)
647         * @see #walkInColumnOrder(RealMatrixPreservingVisitor, int, int, int, int)
648         * @see #walkInOptimizedOrder(RealMatrixChangingVisitor)
649         * @see #walkInOptimizedOrder(RealMatrixPreservingVisitor)
650         * @see #walkInOptimizedOrder(RealMatrixChangingVisitor, int, int, int, int)
651         * @see #walkInOptimizedOrder(RealMatrixPreservingVisitor, int, int, int, int)
652         * @return the value returned by {@link RealMatrixChangingVisitor#end()} at the end
653         * of the walk
654         */
655        double walkInColumnOrder(RealMatrixChangingVisitor visitor,
656                                 int startRow, int endRow, int startColumn, int endColumn);
657    
658        /**
659         * Visit (but don't change) some matrix entries in column order.
660         * <p>Column order starts at upper left and iterating through all elements
661         * of a column from top to bottom before going to the topmost element
662         * of the next column.</p>
663         * @param visitor visitor used to process all matrix entries
664         * @param startRow Initial row index
665         * @param endRow Final row index (inclusive)
666         * @param startColumn Initial column index
667         * @param endColumn Final column index
668         * @throws org.apache.commons.math.exception.OutOfRangeException if
669         * the indices are not valid.
670         * @see #walkInRowOrder(RealMatrixChangingVisitor)
671         * @see #walkInRowOrder(RealMatrixPreservingVisitor)
672         * @see #walkInRowOrder(RealMatrixChangingVisitor, int, int, int, int)
673         * @see #walkInRowOrder(RealMatrixPreservingVisitor, int, int, int, int)
674         * @see #walkInColumnOrder(RealMatrixChangingVisitor)
675         * @see #walkInColumnOrder(RealMatrixPreservingVisitor)
676         * @see #walkInColumnOrder(RealMatrixChangingVisitor, int, int, int, int)
677         * @see #walkInOptimizedOrder(RealMatrixChangingVisitor)
678         * @see #walkInOptimizedOrder(RealMatrixPreservingVisitor)
679         * @see #walkInOptimizedOrder(RealMatrixChangingVisitor, int, int, int, int)
680         * @see #walkInOptimizedOrder(RealMatrixPreservingVisitor, int, int, int, int)
681         * @return the value returned by {@link RealMatrixPreservingVisitor#end()} at the end
682         * of the walk
683         */
684        double walkInColumnOrder(RealMatrixPreservingVisitor visitor,
685                                 int startRow, int endRow, int startColumn, int endColumn);
686    
687        /**
688         * Visit (and possibly change) all matrix entries using the fastest possible order.
689         * <p>The fastest walking order depends on the exact matrix class. It may be
690         * different from traditional row or column orders.</p>
691         * @param visitor visitor used to process all matrix entries
692         * @see #walkInRowOrder(RealMatrixChangingVisitor)
693         * @see #walkInRowOrder(RealMatrixPreservingVisitor)
694         * @see #walkInRowOrder(RealMatrixChangingVisitor, int, int, int, int)
695         * @see #walkInRowOrder(RealMatrixPreservingVisitor, int, int, int, int)
696         * @see #walkInColumnOrder(RealMatrixChangingVisitor)
697         * @see #walkInColumnOrder(RealMatrixPreservingVisitor)
698         * @see #walkInColumnOrder(RealMatrixChangingVisitor, int, int, int, int)
699         * @see #walkInColumnOrder(RealMatrixPreservingVisitor, int, int, int, int)
700         * @see #walkInOptimizedOrder(RealMatrixPreservingVisitor)
701         * @see #walkInOptimizedOrder(RealMatrixChangingVisitor, int, int, int, int)
702         * @see #walkInOptimizedOrder(RealMatrixPreservingVisitor, int, int, int, int)
703         * @return the value returned by {@link RealMatrixChangingVisitor#end()} at the end
704         * of the walk
705         */
706        double walkInOptimizedOrder(RealMatrixChangingVisitor visitor);
707    
708        /**
709         * Visit (but don't change) all matrix entries using the fastest possible order.
710         * <p>The fastest walking order depends on the exact matrix class. It may be
711         * different from traditional row or column orders.</p>
712         * @param visitor visitor used to process all matrix entries
713         * @see #walkInRowOrder(RealMatrixChangingVisitor)
714         * @see #walkInRowOrder(RealMatrixPreservingVisitor)
715         * @see #walkInRowOrder(RealMatrixChangingVisitor, int, int, int, int)
716         * @see #walkInRowOrder(RealMatrixPreservingVisitor, int, int, int, int)
717         * @see #walkInColumnOrder(RealMatrixChangingVisitor)
718         * @see #walkInColumnOrder(RealMatrixPreservingVisitor)
719         * @see #walkInColumnOrder(RealMatrixChangingVisitor, int, int, int, int)
720         * @see #walkInColumnOrder(RealMatrixPreservingVisitor, int, int, int, int)
721         * @see #walkInOptimizedOrder(RealMatrixChangingVisitor)
722         * @see #walkInOptimizedOrder(RealMatrixChangingVisitor, int, int, int, int)
723         * @see #walkInOptimizedOrder(RealMatrixPreservingVisitor, int, int, int, int)
724         * @return the value returned by {@link RealMatrixPreservingVisitor#end()} at the end
725         * of the walk
726         */
727        double walkInOptimizedOrder(RealMatrixPreservingVisitor visitor);
728    
729        /**
730         * Visit (and possibly change) some matrix entries using the fastest possible order.
731         * <p>The fastest walking order depends on the exact matrix class. It may be
732         * different from traditional row or column orders.</p>
733         * @param visitor visitor used to process all matrix entries
734         * @param startRow Initial row index
735         * @param endRow Final row index (inclusive)
736         * @param startColumn Initial column index
737         * @param endColumn Final column index (inclusive)
738         * @throws org.apache.commons.math.exception.OutOfRangeException if
739         * the indices are not valid.
740         * @see #walkInRowOrder(RealMatrixChangingVisitor)
741         * @see #walkInRowOrder(RealMatrixPreservingVisitor)
742         * @see #walkInRowOrder(RealMatrixChangingVisitor, int, int, int, int)
743         * @see #walkInRowOrder(RealMatrixPreservingVisitor, int, int, int, int)
744         * @see #walkInColumnOrder(RealMatrixChangingVisitor)
745         * @see #walkInColumnOrder(RealMatrixPreservingVisitor)
746         * @see #walkInColumnOrder(RealMatrixChangingVisitor, int, int, int, int)
747         * @see #walkInColumnOrder(RealMatrixPreservingVisitor, int, int, int, int)
748         * @see #walkInOptimizedOrder(RealMatrixChangingVisitor)
749         * @see #walkInOptimizedOrder(RealMatrixPreservingVisitor)
750         * @see #walkInOptimizedOrder(RealMatrixPreservingVisitor, int, int, int, int)
751         * @return the value returned by {@link RealMatrixChangingVisitor#end()} at the end
752         * of the walk
753         */
754        double walkInOptimizedOrder(RealMatrixChangingVisitor visitor,
755                                    int startRow, int endRow, int startColumn, int endColumn);
756    
757        /**
758         * Visit (but don't change) some matrix entries using the fastest possible order.
759         * <p>The fastest walking order depends on the exact matrix class. It may be
760         * different from traditional row or column orders.</p>
761         * @param visitor visitor used to process all matrix entries
762         * @param startRow Initial row index
763         * @param endRow Final row index (inclusive)
764         * @param startColumn Initial column index
765         * @param endColumn Final column index (inclusive)
766         * @throws org.apache.commons.math.exception.OutOfRangeException if the
767         * indices are not valid.
768         * @see #walkInRowOrder(RealMatrixChangingVisitor)
769         * @see #walkInRowOrder(RealMatrixPreservingVisitor)
770         * @see #walkInRowOrder(RealMatrixChangingVisitor, int, int, int, int)
771         * @see #walkInRowOrder(RealMatrixPreservingVisitor, int, int, int, int)
772         * @see #walkInColumnOrder(RealMatrixChangingVisitor)
773         * @see #walkInColumnOrder(RealMatrixPreservingVisitor)
774         * @see #walkInColumnOrder(RealMatrixChangingVisitor, int, int, int, int)
775         * @see #walkInColumnOrder(RealMatrixPreservingVisitor, int, int, int, int)
776         * @see #walkInOptimizedOrder(RealMatrixChangingVisitor)
777         * @see #walkInOptimizedOrder(RealMatrixPreservingVisitor)
778         * @see #walkInOptimizedOrder(RealMatrixChangingVisitor, int, int, int, int)
779         * @return the value returned by {@link RealMatrixPreservingVisitor#end()} at the end
780         * of the walk
781         */
782        double walkInOptimizedOrder(RealMatrixPreservingVisitor visitor,
783                                    int startRow, int endRow, int startColumn, int endColumn);
784    }