Mercurial > hg > octave-nkf
diff liboctave/dMatrix.cc @ 4316:236c10efcde2
[project @ 2003-02-10 21:57:15 by jwe]
author | jwe |
---|---|
date | Mon, 10 Feb 2003 21:57:15 +0000 |
parents | a9560cebae6e |
children | d53c33d93440 |
line wrap: on
line diff
--- a/liboctave/dMatrix.cc +++ b/liboctave/dMatrix.cc @@ -199,14 +199,20 @@ Matrix::insert (const RowVector& a, int r, int c) { int a_len = a.length (); + if (r < 0 || r >= rows () || c < 0 || c + a_len > cols ()) { (*current_liboctave_error_handler) ("range error for insert"); return *this; } - for (int i = 0; i < a_len; i++) - elem (r, c+i) = a.elem (i); + if (a_len > 0) + { + make_unique (); + + for (int i = 0; i < a_len; i++) + xelem (r, c+i) = a.elem (i); + } return *this; } @@ -215,14 +221,20 @@ Matrix::insert (const ColumnVector& a, int r, int c) { int a_len = a.length (); + if (r < 0 || r + a_len > rows () || c < 0 || c >= cols ()) { (*current_liboctave_error_handler) ("range error for insert"); return *this; } - for (int i = 0; i < a_len; i++) - elem (r+i, c) = a.elem (i); + if (a_len > 0) + { + make_unique (); + + for (int i = 0; i < a_len; i++) + xelem (r+i, c) = a.elem (i); + } return *this; } @@ -241,8 +253,15 @@ fill (0.0, r, c, r + a_nr - 1, c + a_nc - 1); - for (int i = 0; i < a.length (); i++) - elem (r+i, c+i) = a.elem (i, i); + int a_len = a.length (); + + if (a_len > 0) + { + make_unique (); + + for (int i = 0; i < a_len; i++) + xelem (r+i, c+i) = a.elem (i, i); + } return *this; } @@ -252,10 +271,15 @@ { int nr = rows (); int nc = cols (); + if (nr > 0 && nc > 0) - for (int j = 0; j < nc; j++) - for (int i = 0; i < nr; i++) - elem (i, j) = val; + { + make_unique (); + + for (int j = 0; j < nc; j++) + for (int i = 0; i < nr; i++) + xelem (i, j) = val; + } return *this; } @@ -265,6 +289,7 @@ { int nr = rows (); int nc = cols (); + if (r1 < 0 || r2 < 0 || c1 < 0 || c2 < 0 || r1 >= nr || r2 >= nr || c1 >= nc || c2 >= nc) { @@ -275,9 +300,14 @@ if (r1 > r2) { int tmp = r1; r1 = r2; r2 = tmp; } if (c1 > c2) { int tmp = c1; c1 = c2; c2 = tmp; } - for (int j = c1; j <= c2; j++) - for (int i = r1; i <= r2; i++) - elem (i, j) = val; + if (r2 >= r1 && c2 >= c1) + { + make_unique (); + + for (int j = c1; j <= c2; j++) + for (int i = r1; i <= r2; i++) + xelem (i, j) = val; + } return *this; } @@ -465,7 +495,19 @@ for (int j = 0; j < new_c; j++) for (int i = 0; i < new_r; i++) - result.elem (i, j) = elem (r1+i, c1+j); + result.xelem (i, j) = elem (r1+i, c1+j); + + return result; +} + +Matrix +Matrix::extract_n (int r1, int c1, int nr, int nc) const +{ + Matrix result (nr, nc); + + for (int j = 0; j < nc; j++) + for (int i = 0; i < nr; i++) + result.xelem (i, j) = elem (r1+i, c1+j); return result; } @@ -484,7 +526,7 @@ RowVector retval (nc); for (int j = 0; j < nc; j++) - retval.elem (j) = elem (i, j); + retval.xelem (j) = elem (i, j); return retval; } @@ -522,7 +564,7 @@ ColumnVector retval (nr); for (int j = 0; j < nr; j++) - retval.elem (j) = elem (j, i); + retval.xelem (j) = elem (j, i); return retval; }