• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Licensed to the Apache Software Foundation (ASF) under one or more
3  * contributor license agreements.  See the NOTICE file distributed with
4  * this work for additional information regarding copyright ownership.
5  * The ASF licenses this file to You under the Apache License, Version 2.0
6  * (the "License"); you may not use this file except in compliance with
7  * the License.  You may obtain a copy of the License at
8  *
9  *      http://www.apache.org/licenses/LICENSE-2.0
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  */
17 
18 package org.apache.commons.math.linear;
19 
20 
21 import org.apache.commons.math.Field;
22 import org.apache.commons.math.FieldElement;
23 import org.apache.commons.math.linear.MatrixVisitorException;
24 
25 /**
26  * Interface defining field-valued matrix with basic algebraic operations.
27  * <p>
28  * Matrix element indexing is 0-based -- e.g., <code>getEntry(0, 0)</code>
29  * returns the element in the first row, first column of the matrix.</p>
30  *
31  * @param <T> the type of the field elements
32  * @version $Revision: 1073158 $ $Date: 2011-02-21 22:46:52 +0100 (lun. 21 févr. 2011) $
33  */
34 public interface FieldMatrix<T extends FieldElement<T>> extends AnyMatrix {
35 
36     /**
37      * Get the type of field elements of the matrix.
38      * @return type of field elements of the matrix
39      */
getField()40     Field<T> getField();
41 
42     /**
43      * Create a new FieldMatrix<T> of the same type as the instance with the supplied
44      * row and column dimensions.
45      *
46      * @param rowDimension  the number of rows in the new matrix
47      * @param columnDimension  the number of columns in the new matrix
48      * @return a new matrix of the same type as the instance
49      * @throws IllegalArgumentException if row or column dimension is not positive
50      * @since 2.0
51      */
createMatrix(final int rowDimension, final int columnDimension)52     FieldMatrix<T> createMatrix(final int rowDimension, final int columnDimension);
53 
54     /**
55      * Returns a (deep) copy of this.
56      *
57      * @return matrix copy
58      */
copy()59     FieldMatrix<T> copy();
60 
61     /**
62      * Compute the sum of this and m.
63      *
64      * @param m    matrix to be added
65      * @return     this + m
66      * @throws  IllegalArgumentException if m is not the same size as this
67      */
add(FieldMatrix<T> m)68     FieldMatrix<T> add(FieldMatrix<T> m) throws IllegalArgumentException;
69 
70     /**
71      * Compute this minus m.
72      *
73      * @param m    matrix to be subtracted
74      * @return     this + m
75      * @throws  IllegalArgumentException if m is not the same size as this
76      */
subtract(FieldMatrix<T> m)77     FieldMatrix<T> subtract(FieldMatrix<T> m) throws IllegalArgumentException;
78 
79      /**
80      * Returns the result of adding d to each entry of this.
81      *
82      * @param d    value to be added to each entry
83      * @return     d + this
84      */
scalarAdd(T d)85     FieldMatrix<T> scalarAdd(T d);
86 
87     /**
88      * Returns the result multiplying each entry of this by d.
89      *
90      * @param d    value to multiply all entries by
91      * @return     d * this
92      */
scalarMultiply(T d)93     FieldMatrix<T> scalarMultiply(T d);
94 
95     /**
96      * Returns the result of postmultiplying this by m.
97      *
98      * @param m    matrix to postmultiply by
99      * @return     this * m
100      * @throws     IllegalArgumentException
101      *             if columnDimension(this) != rowDimension(m)
102      */
multiply(FieldMatrix<T> m)103     FieldMatrix<T> multiply(FieldMatrix<T> m) throws IllegalArgumentException;
104 
105     /**
106      * Returns the result premultiplying this by <code>m</code>.
107      * @param m    matrix to premultiply by
108      * @return     m * this
109      * @throws     IllegalArgumentException
110      *             if rowDimension(this) != columnDimension(m)
111      */
preMultiply(FieldMatrix<T> m)112     FieldMatrix<T> preMultiply(FieldMatrix<T> m) throws IllegalArgumentException;
113 
114     /**
115      * Returns matrix entries as a two-dimensional array.
116      *
117      * @return    2-dimensional array of entries
118      */
getData()119     T[][] getData();
120 
121     /**
122      * Gets a submatrix. Rows and columns are indicated
123      * counting from 0 to n-1.
124      *
125      * @param startRow Initial row index
126      * @param endRow Final row index (inclusive)
127      * @param startColumn Initial column index
128      * @param endColumn Final column index (inclusive)
129      * @return The subMatrix containing the data of the
130      *         specified rows and columns
131      * @exception MatrixIndexException  if the indices are not valid
132      */
getSubMatrix(int startRow, int endRow, int startColumn, int endColumn)133    FieldMatrix<T> getSubMatrix(int startRow, int endRow, int startColumn, int endColumn)
134        throws MatrixIndexException;
135 
136    /**
137     * Gets a submatrix. Rows and columns are indicated
138     * counting from 0 to n-1.
139     *
140     * @param selectedRows Array of row indices.
141     * @param selectedColumns Array of column indices.
142     * @return The subMatrix containing the data in the
143     *         specified rows and columns
144     * @exception MatrixIndexException if row or column selections are not valid
145     */
getSubMatrix(int[] selectedRows, int[] selectedColumns)146    FieldMatrix<T> getSubMatrix(int[] selectedRows, int[] selectedColumns)
147        throws MatrixIndexException;
148 
149    /**
150     * Copy a submatrix. Rows and columns are indicated
151     * counting from 0 to n-1.
152     *
153     * @param startRow Initial row index
154     * @param endRow Final row index (inclusive)
155     * @param startColumn Initial column index
156     * @param endColumn Final column index (inclusive)
157     * @param destination The arrays where the submatrix data should be copied
158     * (if larger than rows/columns counts, only the upper-left part will be used)
159     * @exception MatrixIndexException if the indices are not valid
160     * @exception IllegalArgumentException if the destination array is too small
161     */
copySubMatrix(int startRow, int endRow, int startColumn, int endColumn, T[][] destination)162   void copySubMatrix(int startRow, int endRow, int startColumn, int endColumn,
163                      T[][] destination)
164       throws MatrixIndexException, IllegalArgumentException;
165 
166   /**
167    * Copy a submatrix. Rows and columns are indicated
168    * counting from 0 to n-1.
169    *
170     * @param selectedRows Array of row indices.
171     * @param selectedColumns Array of column indices.
172    * @param destination The arrays where the submatrix data should be copied
173    * (if larger than rows/columns counts, only the upper-left part will be used)
174    * @exception MatrixIndexException if the indices are not valid
175    * @exception IllegalArgumentException if the destination array is too small
176    */
copySubMatrix(int[] selectedRows, int[] selectedColumns, T[][] destination)177   void copySubMatrix(int[] selectedRows, int[] selectedColumns, T[][] destination)
178       throws MatrixIndexException, IllegalArgumentException;
179 
180    /**
181     * Replace the submatrix starting at <code>row, column</code> using data in
182     * the input <code>subMatrix</code> array. Indexes are 0-based.
183     * <p>
184     * Example:<br>
185     * Starting with <pre>
186     * 1  2  3  4
187     * 5  6  7  8
188     * 9  0  1  2
189     * </pre>
190     * and <code>subMatrix = {{3, 4} {5,6}}</code>, invoking
191     * <code>setSubMatrix(subMatrix,1,1))</code> will result in <pre>
192     * 1  2  3  4
193     * 5  3  4  8
194     * 9  5  6  2
195     * </pre></p>
196     *
197     * @param subMatrix  array containing the submatrix replacement data
198     * @param row  row coordinate of the top, left element to be replaced
199     * @param column  column coordinate of the top, left element to be replaced
200     * @throws MatrixIndexException  if subMatrix does not fit into this
201     *    matrix from element in (row, column)
202     * @throws IllegalArgumentException if <code>subMatrix</code> is not rectangular
203     *  (not all rows have the same length) or empty
204     * @throws NullPointerException if <code>subMatrix</code> is null
205     * @since 2.0
206     */
setSubMatrix(T[][] subMatrix, int row, int column)207    void setSubMatrix(T[][] subMatrix, int row, int column)
208        throws MatrixIndexException;
209 
210    /**
211     * Returns the entries in row number <code>row</code>
212     * as a row matrix.  Row indices start at 0.
213     *
214     * @param row the row to be fetched
215     * @return row matrix
216     * @throws MatrixIndexException if the specified row index is invalid
217     */
getRowMatrix(int row)218    FieldMatrix<T> getRowMatrix(int row) throws MatrixIndexException;
219 
220    /**
221     * Sets the entries in row number <code>row</code>
222     * as a row matrix.  Row indices start at 0.
223     *
224     * @param row the row to be set
225     * @param matrix row matrix (must have one row and the same number of columns
226     * as the instance)
227     * @throws MatrixIndexException if the specified row index is invalid
228     * @throws InvalidMatrixException if the matrix dimensions do not match one
229     * instance row
230     */
setRowMatrix(int row, FieldMatrix<T> matrix)231    void setRowMatrix(int row, FieldMatrix<T> matrix)
232        throws MatrixIndexException, InvalidMatrixException;
233 
234    /**
235     * Returns the entries in column number <code>column</code>
236     * as a column matrix.  Column indices start at 0.
237     *
238     * @param column the column to be fetched
239     * @return column matrix
240     * @throws MatrixIndexException if the specified column index is invalid
241     */
getColumnMatrix(int column)242    FieldMatrix<T> getColumnMatrix(int column) throws MatrixIndexException;
243 
244    /**
245     * Sets the entries in column number <code>column</code>
246     * as a column matrix.  Column indices start at 0.
247     *
248     * @param column the column to be set
249     * @param matrix column matrix (must have one column and the same number of rows
250     * as the instance)
251     * @throws MatrixIndexException if the specified column index is invalid
252     * @throws InvalidMatrixException if the matrix dimensions do not match one
253     * instance column
254     */
setColumnMatrix(int column, FieldMatrix<T> matrix)255    void setColumnMatrix(int column, FieldMatrix<T> matrix)
256        throws MatrixIndexException, InvalidMatrixException;
257 
258    /**
259     * Returns the entries in row number <code>row</code>
260     * as a vector.  Row indices start at 0.
261     *
262     * @param row the row to be fetched
263     * @return row vector
264     * @throws MatrixIndexException if the specified row index is invalid
265     */
getRowVector(int row)266    FieldVector<T> getRowVector(int row) throws MatrixIndexException;
267 
268    /**
269     * Sets the entries in row number <code>row</code>
270     * as a vector.  Row indices start at 0.
271     *
272     * @param row the row to be set
273     * @param vector row vector (must have the same number of columns
274     * as the instance)
275     * @throws MatrixIndexException if the specified row index is invalid
276     * @throws InvalidMatrixException if the vector dimension does not match one
277     * instance row
278     */
setRowVector(int row, FieldVector<T> vector)279    void setRowVector(int row, FieldVector<T> vector)
280        throws MatrixIndexException, InvalidMatrixException;
281 
282    /**
283     * Returns the entries in column number <code>column</code>
284     * as a vector.  Column indices start at 0.
285     *
286     * @param column the column to be fetched
287     * @return column vector
288     * @throws MatrixIndexException if the specified column index is invalid
289     */
getColumnVector(int column)290    FieldVector<T> getColumnVector(int column) throws MatrixIndexException;
291 
292    /**
293     * Sets the entries in column number <code>column</code>
294     * as a vector.  Column indices start at 0.
295     *
296     * @param column the column to be set
297     * @param vector column vector (must have the same number of rows as the instance)
298     * @throws MatrixIndexException if the specified column index is invalid
299     * @throws InvalidMatrixException if the vector dimension does not match one
300     * instance column
301     */
setColumnVector(int column, FieldVector<T> vector)302    void setColumnVector(int column, FieldVector<T> vector)
303        throws MatrixIndexException, InvalidMatrixException;
304 
305     /**
306      * Returns the entries in row number <code>row</code> as an array.
307      * <p>
308      * Row indices start at 0.  A <code>MatrixIndexException</code> is thrown
309      * unless <code>0 <= row < rowDimension.</code></p>
310      *
311      * @param row the row to be fetched
312      * @return array of entries in the row
313      * @throws MatrixIndexException if the specified row index is not valid
314      */
getRow(int row)315     T[] getRow(int row) throws MatrixIndexException;
316 
317     /**
318      * Sets the entries in row number <code>row</code>
319      * as a row matrix.  Row indices start at 0.
320      *
321      * @param row the row to be set
322      * @param array row matrix (must have the same number of columns as the instance)
323      * @throws MatrixIndexException if the specified row index is invalid
324      * @throws InvalidMatrixException if the array size does not match one
325      * instance row
326      */
setRow(int row, T[] array)327     void setRow(int row, T[] array)
328         throws MatrixIndexException, InvalidMatrixException;
329 
330     /**
331      * Returns the entries in column number <code>col</code> as an array.
332      * <p>
333      * Column indices start at 0.  A <code>MatrixIndexException</code> is thrown
334      * unless <code>0 <= column < columnDimension.</code></p>
335      *
336      * @param column the column to be fetched
337      * @return array of entries in the column
338      * @throws MatrixIndexException if the specified column index is not valid
339      */
getColumn(int column)340     T[] getColumn(int column) throws MatrixIndexException;
341 
342     /**
343      * Sets the entries in column number <code>column</code>
344      * as a column matrix.  Column indices start at 0.
345      *
346      * @param column the column to be set
347      * @param array column array (must have the same number of rows as the instance)
348      * @throws MatrixIndexException if the specified column index is invalid
349      * @throws InvalidMatrixException if the array size does not match one
350      * instance column
351      */
setColumn(int column, T[] array)352     void setColumn(int column, T[] array)
353         throws MatrixIndexException, InvalidMatrixException;
354 
355     /**
356      * Returns the entry in the specified row and column.
357      * <p>
358      * Row and column indices start at 0 and must satisfy
359      * <ul>
360      * <li><code>0 <= row < rowDimension</code></li>
361      * <li><code> 0 <= column < columnDimension</code></li>
362      * </ul>
363      * otherwise a <code>MatrixIndexException</code> is thrown.</p>
364      *
365      * @param row  row location of entry to be fetched
366      * @param column  column location of entry to be fetched
367      * @return matrix entry in row,column
368      * @throws MatrixIndexException if the row or column index is not valid
369      */
getEntry(int row, int column)370     T getEntry(int row, int column) throws MatrixIndexException;
371 
372     /**
373      * Set the entry in the specified row and column.
374      * <p>
375      * Row and column indices start at 0 and must satisfy
376      * <ul>
377      * <li><code>0 <= row < rowDimension</code></li>
378      * <li><code> 0 <= column < columnDimension</code></li>
379      * </ul>
380      * otherwise a <code>MatrixIndexException</code> is thrown.</p>
381      *
382      * @param row  row location of entry to be set
383      * @param column  column location of entry to be set
384      * @param value matrix entry to be set in row,column
385      * @throws MatrixIndexException if the row or column index is not valid
386      * @since 2.0
387      */
setEntry(int row, int column, T value)388     void setEntry(int row, int column, T value) throws MatrixIndexException;
389 
390     /**
391      * Change an entry in the specified row and column.
392      * <p>
393      * Row and column indices start at 0 and must satisfy
394      * <ul>
395      * <li><code>0 <= row < rowDimension</code></li>
396      * <li><code> 0 <= column < columnDimension</code></li>
397      * </ul>
398      * otherwise a <code>MatrixIndexException</code> is thrown.</p>
399      *
400      * @param row  row location of entry to be set
401      * @param column  column location of entry to be set
402      * @param increment value to add to the current matrix entry in row,column
403      * @throws MatrixIndexException if the row or column index is not valid
404      * @since 2.0
405      */
addToEntry(int row, int column, T increment)406     void addToEntry(int row, int column, T increment) throws MatrixIndexException;
407 
408     /**
409      * Change an entry in the specified row and column.
410      * <p>
411      * Row and column indices start at 0 and must satisfy
412      * <ul>
413      * <li><code>0 <= row < rowDimension</code></li>
414      * <li><code> 0 <= column < columnDimension</code></li>
415      * </ul>
416      * otherwise a <code>MatrixIndexException</code> is thrown.</p>
417      *
418      * @param row  row location of entry to be set
419      * @param column  column location of entry to be set
420      * @param factor multiplication factor for the current matrix entry in row,column
421      * @throws MatrixIndexException if the row or column index is not valid
422      * @since 2.0
423      */
multiplyEntry(int row, int column, T factor)424     void multiplyEntry(int row, int column, T factor) throws MatrixIndexException;
425 
426     /**
427      * Returns the transpose of this matrix.
428      *
429      * @return transpose matrix
430      */
transpose()431     FieldMatrix<T> transpose();
432 
433     /**
434      * Returns the <a href="http://mathworld.wolfram.com/MatrixTrace.html">
435      * trace</a> of the matrix (the sum of the elements on the main diagonal).
436      *
437      * @return trace
438      * @throws NonSquareMatrixException if the matrix is not square
439      */
getTrace()440     T getTrace() throws NonSquareMatrixException;
441 
442     /**
443      * Returns the result of multiplying this by the vector <code>v</code>.
444      *
445      * @param v the vector to operate on
446      * @return this*v
447      * @throws IllegalArgumentException if columnDimension != v.size()
448      */
operate(T[] v)449     T[] operate(T[] v) throws IllegalArgumentException;
450 
451     /**
452      * Returns the result of multiplying this by the vector <code>v</code>.
453      *
454      * @param v the vector to operate on
455      * @return this*v
456      * @throws IllegalArgumentException if columnDimension != v.size()
457      */
operate(FieldVector<T> v)458     FieldVector<T> operate(FieldVector<T> v) throws IllegalArgumentException;
459 
460     /**
461      * Returns the (row) vector result of premultiplying this by the vector <code>v</code>.
462      *
463      * @param v the row vector to premultiply by
464      * @return v*this
465      * @throws IllegalArgumentException if rowDimension != v.size()
466      */
preMultiply(T[] v)467     T[] preMultiply(T[] v) throws IllegalArgumentException;
468 
469     /**
470      * Returns the (row) vector result of premultiplying this by the vector <code>v</code>.
471      *
472      * @param v the row vector to premultiply by
473      * @return v*this
474      * @throws IllegalArgumentException if rowDimension != v.size()
475      */
preMultiply(FieldVector<T> v)476     FieldVector<T> preMultiply(FieldVector<T> v) throws IllegalArgumentException;
477 
478     /**
479      * Visit (and possibly change) all matrix entries in row order.
480      * <p>Row order starts at upper left and iterating through all elements
481      * of a row from left to right before going to the leftmost element
482      * of the next row.</p>
483      * @param visitor visitor used to process all matrix entries
484      * @exception  MatrixVisitorException if the visitor cannot process an entry
485      * @see #walkInRowOrder(FieldMatrixPreservingVisitor)
486      * @see #walkInRowOrder(FieldMatrixChangingVisitor, int, int, int, int)
487      * @see #walkInRowOrder(FieldMatrixPreservingVisitor, int, int, int, int)
488      * @see #walkInColumnOrder(FieldMatrixChangingVisitor)
489      * @see #walkInColumnOrder(FieldMatrixPreservingVisitor)
490      * @see #walkInColumnOrder(FieldMatrixChangingVisitor, int, int, int, int)
491      * @see #walkInColumnOrder(FieldMatrixPreservingVisitor, int, int, int, int)
492      * @see #walkInOptimizedOrder(FieldMatrixChangingVisitor)
493      * @see #walkInOptimizedOrder(FieldMatrixPreservingVisitor)
494      * @see #walkInOptimizedOrder(FieldMatrixChangingVisitor, int, int, int, int)
495      * @see #walkInOptimizedOrder(FieldMatrixPreservingVisitor, int, int, int, int)
496      * @return the value returned by {@link FieldMatrixChangingVisitor#end()} at the end
497      * of the walk
498      */
walkInRowOrder(FieldMatrixChangingVisitor<T> visitor)499     T walkInRowOrder(FieldMatrixChangingVisitor<T> visitor)
500         throws MatrixVisitorException;
501 
502     /**
503      * Visit (but don't change) all matrix entries in row order.
504      * <p>Row order starts at upper left and iterating through all elements
505      * of a row from left to right before going to the leftmost element
506      * of the next row.</p>
507      * @param visitor visitor used to process all matrix entries
508      * @exception  MatrixVisitorException if the visitor cannot process an entry
509      * @see #walkInRowOrder(FieldMatrixChangingVisitor)
510      * @see #walkInRowOrder(FieldMatrixChangingVisitor, int, int, int, int)
511      * @see #walkInRowOrder(FieldMatrixPreservingVisitor, int, int, int, int)
512      * @see #walkInColumnOrder(FieldMatrixChangingVisitor)
513      * @see #walkInColumnOrder(FieldMatrixPreservingVisitor)
514      * @see #walkInColumnOrder(FieldMatrixChangingVisitor, int, int, int, int)
515      * @see #walkInColumnOrder(FieldMatrixPreservingVisitor, int, int, int, int)
516      * @see #walkInOptimizedOrder(FieldMatrixChangingVisitor)
517      * @see #walkInOptimizedOrder(FieldMatrixPreservingVisitor)
518      * @see #walkInOptimizedOrder(FieldMatrixChangingVisitor, int, int, int, int)
519      * @see #walkInOptimizedOrder(FieldMatrixPreservingVisitor, int, int, int, int)
520      * @return the value returned by {@link FieldMatrixPreservingVisitor#end()} at the end
521      * of the walk
522      */
walkInRowOrder(FieldMatrixPreservingVisitor<T> visitor)523     T walkInRowOrder(FieldMatrixPreservingVisitor<T> visitor)
524         throws MatrixVisitorException;
525 
526     /**
527      * Visit (and possibly change) some matrix entries in row order.
528      * <p>Row order starts at upper left and iterating through all elements
529      * of a row from left to right before going to the leftmost element
530      * of the next row.</p>
531      * @param visitor visitor used to process all matrix entries
532      * @param startRow Initial row index
533      * @param endRow Final row index (inclusive)
534      * @param startColumn Initial column index
535      * @param endColumn Final column index
536      * @exception  MatrixVisitorException if the visitor cannot process an entry
537      * @exception MatrixIndexException  if the indices are not valid
538      * @see #walkInRowOrder(FieldMatrixChangingVisitor)
539      * @see #walkInRowOrder(FieldMatrixPreservingVisitor)
540      * @see #walkInRowOrder(FieldMatrixPreservingVisitor, int, int, int, int)
541      * @see #walkInColumnOrder(FieldMatrixChangingVisitor)
542      * @see #walkInColumnOrder(FieldMatrixPreservingVisitor)
543      * @see #walkInColumnOrder(FieldMatrixChangingVisitor, int, int, int, int)
544      * @see #walkInColumnOrder(FieldMatrixPreservingVisitor, int, int, int, int)
545      * @see #walkInOptimizedOrder(FieldMatrixChangingVisitor)
546      * @see #walkInOptimizedOrder(FieldMatrixPreservingVisitor)
547      * @see #walkInOptimizedOrder(FieldMatrixChangingVisitor, int, int, int, int)
548      * @see #walkInOptimizedOrder(FieldMatrixPreservingVisitor, int, int, int, int)
549      * @return the value returned by {@link FieldMatrixChangingVisitor#end()} at the end
550      * of the walk
551      */
walkInRowOrder(FieldMatrixChangingVisitor<T> visitor, int startRow, int endRow, int startColumn, int endColumn)552     T walkInRowOrder(FieldMatrixChangingVisitor<T> visitor,
553                           int startRow, int endRow, int startColumn, int endColumn)
554         throws MatrixIndexException, MatrixVisitorException;
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      * @exception  MatrixVisitorException if the visitor cannot process an entry
567      * @exception MatrixIndexException  if the indices are not valid
568      * @see #walkInRowOrder(FieldMatrixChangingVisitor)
569      * @see #walkInRowOrder(FieldMatrixPreservingVisitor)
570      * @see #walkInRowOrder(FieldMatrixChangingVisitor, int, int, int, int)
571      * @see #walkInColumnOrder(FieldMatrixChangingVisitor)
572      * @see #walkInColumnOrder(FieldMatrixPreservingVisitor)
573      * @see #walkInColumnOrder(FieldMatrixChangingVisitor, int, int, int, int)
574      * @see #walkInColumnOrder(FieldMatrixPreservingVisitor, int, int, int, int)
575      * @see #walkInOptimizedOrder(FieldMatrixChangingVisitor)
576      * @see #walkInOptimizedOrder(FieldMatrixPreservingVisitor)
577      * @see #walkInOptimizedOrder(FieldMatrixChangingVisitor, int, int, int, int)
578      * @see #walkInOptimizedOrder(FieldMatrixPreservingVisitor, int, int, int, int)
579      * @return the value returned by {@link FieldMatrixPreservingVisitor#end()} at the end
580      * of the walk
581      */
walkInRowOrder(FieldMatrixPreservingVisitor<T> visitor, int startRow, int endRow, int startColumn, int endColumn)582     T walkInRowOrder(FieldMatrixPreservingVisitor<T> visitor,
583                           int startRow, int endRow, int startColumn, int endColumn)
584         throws MatrixIndexException, MatrixVisitorException;
585 
586     /**
587      * Visit (and possibly change) all matrix entries in column order.
588      * <p>Column order starts at upper left and iterating through all elements
589      * of a column from top to bottom before going to the topmost element
590      * of the next column.</p>
591      * @param visitor visitor used to process all matrix entries
592      * @exception  MatrixVisitorException if the visitor cannot process an entry
593      * @see #walkInRowOrder(FieldMatrixChangingVisitor)
594      * @see #walkInRowOrder(FieldMatrixPreservingVisitor)
595      * @see #walkInRowOrder(FieldMatrixChangingVisitor, int, int, int, int)
596      * @see #walkInRowOrder(FieldMatrixPreservingVisitor, int, int, int, int)
597      * @see #walkInColumnOrder(FieldMatrixPreservingVisitor)
598      * @see #walkInColumnOrder(FieldMatrixChangingVisitor, int, int, int, int)
599      * @see #walkInColumnOrder(FieldMatrixPreservingVisitor, int, int, int, int)
600      * @see #walkInOptimizedOrder(FieldMatrixChangingVisitor)
601      * @see #walkInOptimizedOrder(FieldMatrixPreservingVisitor)
602      * @see #walkInOptimizedOrder(FieldMatrixChangingVisitor, int, int, int, int)
603      * @see #walkInOptimizedOrder(FieldMatrixPreservingVisitor, int, int, int, int)
604      * @return the value returned by {@link FieldMatrixChangingVisitor#end()} at the end
605      * of the walk
606      */
walkInColumnOrder(FieldMatrixChangingVisitor<T> visitor)607     T walkInColumnOrder(FieldMatrixChangingVisitor<T> visitor)
608         throws MatrixVisitorException;
609 
610     /**
611      * Visit (but don't change) all matrix entries in column order.
612      * <p>Column order starts at upper left and iterating through all elements
613      * of a column from top to bottom before going to the topmost element
614      * of the next column.</p>
615      * @param visitor visitor used to process all matrix entries
616      * @exception  MatrixVisitorException if the visitor cannot process an entry
617      * @see #walkInRowOrder(FieldMatrixChangingVisitor)
618      * @see #walkInRowOrder(FieldMatrixPreservingVisitor)
619      * @see #walkInRowOrder(FieldMatrixChangingVisitor, int, int, int, int)
620      * @see #walkInRowOrder(FieldMatrixPreservingVisitor, int, int, int, int)
621      * @see #walkInColumnOrder(FieldMatrixChangingVisitor)
622      * @see #walkInColumnOrder(FieldMatrixChangingVisitor, int, int, int, int)
623      * @see #walkInColumnOrder(FieldMatrixPreservingVisitor, int, int, int, int)
624      * @see #walkInOptimizedOrder(FieldMatrixChangingVisitor)
625      * @see #walkInOptimizedOrder(FieldMatrixPreservingVisitor)
626      * @see #walkInOptimizedOrder(FieldMatrixChangingVisitor, int, int, int, int)
627      * @see #walkInOptimizedOrder(FieldMatrixPreservingVisitor, int, int, int, int)
628      * @return the value returned by {@link FieldMatrixPreservingVisitor#end()} at the end
629      * of the walk
630      */
walkInColumnOrder(FieldMatrixPreservingVisitor<T> visitor)631     T walkInColumnOrder(FieldMatrixPreservingVisitor<T> visitor)
632         throws MatrixVisitorException;
633 
634     /**
635      * Visit (and possibly change) some matrix entries in column order.
636      * <p>Column order starts at upper left and iterating through all elements
637      * of a column from top to bottom before going to the topmost element
638      * of the next column.</p>
639      * @param visitor visitor used to process all matrix entries
640      * @param startRow Initial row index
641      * @param endRow Final row index (inclusive)
642      * @param startColumn Initial column index
643      * @param endColumn Final column index
644      * @exception  MatrixVisitorException if the visitor cannot process an entry
645      * @exception MatrixIndexException  if the indices are not valid
646      * @see #walkInRowOrder(FieldMatrixChangingVisitor)
647      * @see #walkInRowOrder(FieldMatrixPreservingVisitor)
648      * @see #walkInRowOrder(FieldMatrixChangingVisitor, int, int, int, int)
649      * @see #walkInRowOrder(FieldMatrixPreservingVisitor, int, int, int, int)
650      * @see #walkInColumnOrder(FieldMatrixChangingVisitor)
651      * @see #walkInColumnOrder(FieldMatrixPreservingVisitor)
652      * @see #walkInColumnOrder(FieldMatrixPreservingVisitor, int, int, int, int)
653      * @see #walkInOptimizedOrder(FieldMatrixChangingVisitor)
654      * @see #walkInOptimizedOrder(FieldMatrixPreservingVisitor)
655      * @see #walkInOptimizedOrder(FieldMatrixChangingVisitor, int, int, int, int)
656      * @see #walkInOptimizedOrder(FieldMatrixPreservingVisitor, int, int, int, int)
657      * @return the value returned by {@link FieldMatrixChangingVisitor#end()} at the end
658      * of the walk
659      */
walkInColumnOrder(FieldMatrixChangingVisitor<T> visitor, int startRow, int endRow, int startColumn, int endColumn)660     T walkInColumnOrder(FieldMatrixChangingVisitor<T> visitor,
661                              int startRow, int endRow, int startColumn, int endColumn)
662         throws MatrixIndexException, MatrixVisitorException;
663 
664     /**
665      * Visit (but don't change) some matrix entries in column order.
666      * <p>Column order starts at upper left and iterating through all elements
667      * of a column from top to bottom before going to the topmost element
668      * of the next column.</p>
669      * @param visitor visitor used to process all matrix entries
670      * @param startRow Initial row index
671      * @param endRow Final row index (inclusive)
672      * @param startColumn Initial column index
673      * @param endColumn Final column index
674      * @exception  MatrixVisitorException if the visitor cannot process an entry
675      * @exception MatrixIndexException  if the indices are not valid
676      * @see #walkInRowOrder(FieldMatrixChangingVisitor)
677      * @see #walkInRowOrder(FieldMatrixPreservingVisitor)
678      * @see #walkInRowOrder(FieldMatrixChangingVisitor, int, int, int, int)
679      * @see #walkInRowOrder(FieldMatrixPreservingVisitor, int, int, int, int)
680      * @see #walkInColumnOrder(FieldMatrixChangingVisitor)
681      * @see #walkInColumnOrder(FieldMatrixPreservingVisitor)
682      * @see #walkInColumnOrder(FieldMatrixChangingVisitor, int, int, int, int)
683      * @see #walkInOptimizedOrder(FieldMatrixChangingVisitor)
684      * @see #walkInOptimizedOrder(FieldMatrixPreservingVisitor)
685      * @see #walkInOptimizedOrder(FieldMatrixChangingVisitor, int, int, int, int)
686      * @see #walkInOptimizedOrder(FieldMatrixPreservingVisitor, int, int, int, int)
687      * @return the value returned by {@link FieldMatrixPreservingVisitor#end()} at the end
688      * of the walk
689      */
walkInColumnOrder(FieldMatrixPreservingVisitor<T> visitor, int startRow, int endRow, int startColumn, int endColumn)690     T walkInColumnOrder(FieldMatrixPreservingVisitor<T> visitor,
691                              int startRow, int endRow, int startColumn, int endColumn)
692         throws MatrixIndexException, MatrixVisitorException;
693 
694     /**
695      * Visit (and possibly change) all matrix entries using the fastest possible order.
696      * <p>The fastest walking order depends on the exact matrix class. It may be
697      * different from traditional row or column orders.</p>
698      * @param visitor visitor used to process all matrix entries
699      * @exception  MatrixVisitorException if the visitor cannot process an entry
700      * @see #walkInRowOrder(FieldMatrixChangingVisitor)
701      * @see #walkInRowOrder(FieldMatrixPreservingVisitor)
702      * @see #walkInRowOrder(FieldMatrixChangingVisitor, int, int, int, int)
703      * @see #walkInRowOrder(FieldMatrixPreservingVisitor, int, int, int, int)
704      * @see #walkInColumnOrder(FieldMatrixChangingVisitor)
705      * @see #walkInColumnOrder(FieldMatrixPreservingVisitor)
706      * @see #walkInColumnOrder(FieldMatrixChangingVisitor, int, int, int, int)
707      * @see #walkInColumnOrder(FieldMatrixPreservingVisitor, int, int, int, int)
708      * @see #walkInOptimizedOrder(FieldMatrixPreservingVisitor)
709      * @see #walkInOptimizedOrder(FieldMatrixChangingVisitor, int, int, int, int)
710      * @see #walkInOptimizedOrder(FieldMatrixPreservingVisitor, int, int, int, int)
711      * @return the value returned by {@link FieldMatrixChangingVisitor#end()} at the end
712      * of the walk
713      */
walkInOptimizedOrder(FieldMatrixChangingVisitor<T> visitor)714     T walkInOptimizedOrder(FieldMatrixChangingVisitor<T> visitor)
715         throws MatrixVisitorException;
716 
717     /**
718      * Visit (but don't change) all matrix entries using the fastest possible order.
719      * <p>The fastest walking order depends on the exact matrix class. It may be
720      * different from traditional row or column orders.</p>
721      * @param visitor visitor used to process all matrix entries
722      * @exception  MatrixVisitorException if the visitor cannot process an entry
723      * @see #walkInRowOrder(FieldMatrixChangingVisitor)
724      * @see #walkInRowOrder(FieldMatrixPreservingVisitor)
725      * @see #walkInRowOrder(FieldMatrixChangingVisitor, int, int, int, int)
726      * @see #walkInRowOrder(FieldMatrixPreservingVisitor, int, int, int, int)
727      * @see #walkInColumnOrder(FieldMatrixChangingVisitor)
728      * @see #walkInColumnOrder(FieldMatrixPreservingVisitor)
729      * @see #walkInColumnOrder(FieldMatrixChangingVisitor, int, int, int, int)
730      * @see #walkInColumnOrder(FieldMatrixPreservingVisitor, int, int, int, int)
731      * @see #walkInOptimizedOrder(FieldMatrixChangingVisitor)
732      * @see #walkInOptimizedOrder(FieldMatrixChangingVisitor, int, int, int, int)
733      * @see #walkInOptimizedOrder(FieldMatrixPreservingVisitor, int, int, int, int)
734      * @return the value returned by {@link FieldMatrixPreservingVisitor#end()} at the end
735      * of the walk
736      */
walkInOptimizedOrder(FieldMatrixPreservingVisitor<T> visitor)737     T walkInOptimizedOrder(FieldMatrixPreservingVisitor<T> visitor)
738         throws MatrixVisitorException;
739 
740     /**
741      * Visit (and possibly change) some matrix entries using the fastest possible order.
742      * <p>The fastest walking order depends on the exact matrix class. It may be
743      * different from traditional row or column orders.</p>
744      * @param visitor visitor used to process all matrix entries
745      * @param startRow Initial row index
746      * @param endRow Final row index (inclusive)
747      * @param startColumn Initial column index
748      * @param endColumn Final column index (inclusive)
749      * @exception  MatrixVisitorException if the visitor cannot process an entry
750      * @exception MatrixIndexException  if the indices are not valid
751      * @see #walkInRowOrder(FieldMatrixChangingVisitor)
752      * @see #walkInRowOrder(FieldMatrixPreservingVisitor)
753      * @see #walkInRowOrder(FieldMatrixChangingVisitor, int, int, int, int)
754      * @see #walkInRowOrder(FieldMatrixPreservingVisitor, int, int, int, int)
755      * @see #walkInColumnOrder(FieldMatrixChangingVisitor)
756      * @see #walkInColumnOrder(FieldMatrixPreservingVisitor)
757      * @see #walkInColumnOrder(FieldMatrixChangingVisitor, int, int, int, int)
758      * @see #walkInColumnOrder(FieldMatrixPreservingVisitor, int, int, int, int)
759      * @see #walkInOptimizedOrder(FieldMatrixChangingVisitor)
760      * @see #walkInOptimizedOrder(FieldMatrixPreservingVisitor)
761      * @see #walkInOptimizedOrder(FieldMatrixPreservingVisitor, int, int, int, int)
762      * @return the value returned by {@link FieldMatrixChangingVisitor#end()} at the end
763      * of the walk
764      */
walkInOptimizedOrder(FieldMatrixChangingVisitor<T> visitor, int startRow, int endRow, int startColumn, int endColumn)765     T walkInOptimizedOrder(FieldMatrixChangingVisitor<T> visitor,
766                                 int startRow, int endRow, int startColumn, int endColumn)
767         throws MatrixIndexException, MatrixVisitorException;
768 
769     /**
770      * Visit (but don't change) some matrix entries using the fastest possible order.
771      * <p>The fastest walking order depends on the exact matrix class. It may be
772      * different from traditional row or column orders.</p>
773      * @param visitor visitor used to process all matrix entries
774      * @param startRow Initial row index
775      * @param endRow Final row index (inclusive)
776      * @param startColumn Initial column index
777      * @param endColumn Final column index (inclusive)
778      * @exception  MatrixVisitorException if the visitor cannot process an entry
779      * @exception MatrixIndexException  if the indices are not valid
780      * @see #walkInRowOrder(FieldMatrixChangingVisitor)
781      * @see #walkInRowOrder(FieldMatrixPreservingVisitor)
782      * @see #walkInRowOrder(FieldMatrixChangingVisitor, int, int, int, int)
783      * @see #walkInRowOrder(FieldMatrixPreservingVisitor, int, int, int, int)
784      * @see #walkInColumnOrder(FieldMatrixChangingVisitor)
785      * @see #walkInColumnOrder(FieldMatrixPreservingVisitor)
786      * @see #walkInColumnOrder(FieldMatrixChangingVisitor, int, int, int, int)
787      * @see #walkInColumnOrder(FieldMatrixPreservingVisitor, int, int, int, int)
788      * @see #walkInOptimizedOrder(FieldMatrixChangingVisitor)
789      * @see #walkInOptimizedOrder(FieldMatrixPreservingVisitor)
790      * @see #walkInOptimizedOrder(FieldMatrixChangingVisitor, int, int, int, int)
791      * @return the value returned by {@link FieldMatrixPreservingVisitor#end()} at the end
792      * of the walk
793      */
walkInOptimizedOrder(FieldMatrixPreservingVisitor<T> visitor, int startRow, int endRow, int startColumn, int endColumn)794     T walkInOptimizedOrder(FieldMatrixPreservingVisitor<T> visitor,
795                                 int startRow, int endRow, int startColumn, int endColumn)
796         throws MatrixIndexException, MatrixVisitorException;
797 
798 }
799