Mercurial > hg > octave-nkf
comparison liboctave/Array.cc @ 4757:c48180a45d34
[project @ 2004-02-13 22:13:52 by jwe]
author | jwe |
---|---|
date | Fri, 13 Feb 2004 22:13:52 +0000 |
parents | 60c78bde10e5 |
children | 364bbf35dbfa |
comparison
equal
deleted
inserted
replaced
4756:60c78bde10e5 | 4757:c48180a45d34 |
---|---|
1439 int n_idx = ra_idx.length (); | 1439 int n_idx = ra_idx.length (); |
1440 | 1440 |
1441 dim_vector lhs_dims = dims (); | 1441 dim_vector lhs_dims = dims (); |
1442 | 1442 |
1443 int n_lhs_dims = lhs_dims.length (); | 1443 int n_lhs_dims = lhs_dims.length (); |
1444 | 1444 |
1445 Array<int> idx_is_colon (n_idx, 0); | 1445 Array<int> idx_is_colon (n_idx, 0); |
1446 | 1446 |
1447 Array<int> idx_is_colon_equiv (n_idx, 0); | 1447 Array<int> idx_is_colon_equiv (n_idx, 0); |
1448 | 1448 |
1449 // Initialization of colon arrays. | 1449 // Initialization of colon arrays. |
1450 | 1450 |
1451 for (int i = 0; i < n_idx; i++) | 1451 for (int i = 0; i < n_idx; i++) |
1452 { | 1452 { |
1453 idx_is_colon_equiv(i) = ra_idx(i).is_colon_equiv (lhs_dims(i), 1); | 1453 idx_is_colon_equiv(i) = ra_idx(i).is_colon_equiv (lhs_dims(i), 1); |
1454 | 1454 |
1455 idx_is_colon(i) = ra_idx(i).is_colon (); | 1455 idx_is_colon(i) = ra_idx(i).is_colon (); |
1462 for (int i = 0 ; i < n_idx - 1; i++) | 1462 for (int i = 0 ; i < n_idx - 1; i++) |
1463 { | 1463 { |
1464 if (! (idx_is_colon(i) || idx_is_colon_equiv(i))) | 1464 if (! (idx_is_colon(i) || idx_is_colon_equiv(i))) |
1465 { | 1465 { |
1466 ra_idx(i).sort (true); | 1466 ra_idx(i).sort (true); |
1467 | 1467 |
1468 if (ra_idx(i).max () > lhs_dims(i)) | 1468 if (ra_idx(i).max () > lhs_dims(i)) |
1469 { | 1469 { |
1470 (*current_liboctave_error_handler) | 1470 (*current_liboctave_error_handler) |
1471 ("index exceeds array dimensions"); | 1471 ("index exceeds array dimensions"); |
1472 | 1472 |
1473 idx_ok = false; | 1473 idx_ok = false; |
1474 break; | 1474 break; |
1475 } | 1475 } |
1476 else if (ra_idx(i).min () < 0) // I believe this is checked elsewhere | 1476 else if (ra_idx(i).min () < 0) // I believe this is checked elsewhere |
1477 { | 1477 { |
1481 idx_ok = false; | 1481 idx_ok = false; |
1482 break; | 1482 break; |
1483 } | 1483 } |
1484 } | 1484 } |
1485 } | 1485 } |
1486 | 1486 |
1487 if (n_idx <= n_lhs_dims) | 1487 if (n_idx <= n_lhs_dims) |
1488 { | 1488 { |
1489 int last_idx = ra_idx(n_idx-1).max (); | 1489 int last_idx = ra_idx(n_idx-1).max (); |
1490 | 1490 |
1491 int sum_el = lhs_dims(n_idx-1); | 1491 int sum_el = lhs_dims(n_idx-1); |
1492 | 1492 |
1493 for (int i = n_idx; i < n_lhs_dims; i++) | 1493 for (int i = n_idx; i < n_lhs_dims; i++) |
1494 sum_el *= lhs_dims(i); | 1494 sum_el *= lhs_dims(i); |
1495 | 1495 |
1496 if (last_idx > sum_el - 1) | 1496 if (last_idx > sum_el - 1) |
1497 { | 1497 { |
1498 (*current_liboctave_error_handler) | 1498 (*current_liboctave_error_handler) |
1499 ("index exceeds array dimensions"); | 1499 ("index exceeds array dimensions"); |
1500 | 1500 |
1501 idx_ok = false; | 1501 idx_ok = false; |
1502 } | 1502 } |
1503 } | 1503 } |
1504 | 1504 |
1505 if (idx_ok) | 1505 if (idx_ok) |
1506 { | 1506 { |
1507 if (n_idx > 1 | 1507 if (n_idx > 1 |
1508 && (all_ones (idx_is_colon) || all_ones (idx_is_colon_equiv))) | 1508 && (all_ones (idx_is_colon) || all_ones (idx_is_colon_equiv))) |
1699 // | 1699 // |
1700 // A(3,3,3)=2; | 1700 // A(3,3,3)=2; |
1701 // A(3:5) = []; A(6)=[] | 1701 // A(3:5) = []; A(6)=[] |
1702 // | 1702 // |
1703 idx_vector idx_vec = ra_idx(0); | 1703 idx_vector idx_vec = ra_idx(0); |
1704 | 1704 |
1705 int num_to_delete = idx_vec.capacity (); | 1705 int num_to_delete = idx_vec.capacity (); |
1706 | 1706 |
1707 int lhs_numel = numel (); | 1707 int lhs_numel = numel (); |
1708 | 1708 |
1709 int new_numel = lhs_numel - num_to_delete; | 1709 int new_numel = lhs_numel - num_to_delete; |
1710 | 1710 |
1711 T *new_data = new T[new_numel]; | 1711 T *new_data = new T[new_numel]; |
1712 | 1712 |
1713 Array<int> lhs_ra_idx (ndims (), 0); | 1713 Array<int> lhs_ra_idx (ndims (), 0); |
1714 | 1714 |
1715 int ii = 0; | 1715 int ii = 0; |
1716 int iidx = 0; | 1716 int iidx = 0; |
1717 | 1717 |
1718 for (int i = 0; i < lhs_numel; i++) | 1718 for (int i = 0; i < lhs_numel; i++) |
1719 { | 1719 { |
1720 if (iidx < num_to_delete && i == idx_vec.elem (iidx)) | 1720 if (iidx < num_to_delete && i == idx_vec.elem (iidx)) |
1721 { | 1721 { |
1733 delete Array<T>::rep; | 1733 delete Array<T>::rep; |
1734 | 1734 |
1735 Array<T>::rep = new typename Array<T>::ArrayRep (new_data, new_numel); | 1735 Array<T>::rep = new typename Array<T>::ArrayRep (new_data, new_numel); |
1736 | 1736 |
1737 dimensions.resize (2); | 1737 dimensions.resize (2); |
1738 | 1738 |
1739 if (lhs_dims.length () == 2 && lhs_dims(1) == 1) | 1739 if (lhs_dims.length () == 2 && lhs_dims(1) == 1) |
1740 { | 1740 { |
1741 dimensions(0) = new_numel; | 1741 dimensions(0) = new_numel; |
1742 dimensions(1) = 1; | 1742 dimensions(1) = 1; |
1743 } | 1743 } |
1979 | 1979 |
1980 int n_dims = dims().length (); | 1980 int n_dims = dims().length (); |
1981 | 1981 |
1982 int orig_len = dims().numel (); | 1982 int orig_len = dims().numel (); |
1983 | 1983 |
1984 dim_vector idx_orig_dims = ra_idx.orig_dimensions (); | 1984 dim_vector idx_orig_dims = ra_idx.orig_dimensions (); |
1985 | 1985 |
1986 if (ra_idx.is_colon ()) | 1986 if (ra_idx.is_colon ()) |
1987 { | 1987 { |
1988 // Fast magic colon processing. | 1988 // Fast magic colon processing. |
1989 | 1989 |
1999 retval = Array<T> (tmp, idx_orig_dims); | 1999 retval = Array<T> (tmp, idx_orig_dims); |
2000 else | 2000 else |
2001 retval = Array<T> (tmp, dim_vector (0, 0)); | 2001 retval = Array<T> (tmp, dim_vector (0, 0)); |
2002 } | 2002 } |
2003 else if (vector_equivalent (dims ())) | 2003 else if (vector_equivalent (dims ())) |
2004 { | 2004 { |
2005 // We're getting elements from a vector equivalent i.e. (1x4x1). | 2005 // We're getting elements from a vector equivalent i.e. (1x4x1). |
2006 | 2006 |
2007 Array<T> tmp = Array<T>::index (ra_idx, resize_ok); | 2007 Array<T> tmp = Array<T>::index (ra_idx, resize_ok); |
2008 | 2008 |
2009 int len = tmp.length (); | 2009 int len = tmp.length (); |
2064 ("single index used for N-d array"); | 2064 ("single index used for N-d array"); |
2065 | 2065 |
2066 ra_idx.freeze (orig_len, "nd-array", resize_ok); | 2066 ra_idx.freeze (orig_len, "nd-array", resize_ok); |
2067 | 2067 |
2068 if (ra_idx) | 2068 if (ra_idx) |
2069 { | 2069 { |
2070 dim_vector result_dims (idx_orig_dims); | 2070 dim_vector result_dims (idx_orig_dims); |
2071 | 2071 |
2072 if (ra_idx.one_zero_only ()) | 2072 if (ra_idx.one_zero_only ()) |
2073 { | 2073 { |
2074 result_dims.resize (2); | 2074 result_dims.resize (2); |
2226 | 2226 |
2227 Array<int> elt_idx; | 2227 Array<int> elt_idx; |
2228 | 2228 |
2229 for (int i = 0; i < n; i++) | 2229 for (int i = 0; i < n; i++) |
2230 { | 2230 { |
2231 elt_idx = get_elt_idx (ra_idx, result_idx); | 2231 elt_idx = get_elt_idx (ra_idx, result_idx); |
2232 | 2232 |
2233 int numelem_elt = get_scalar_idx (elt_idx, this_dims); | 2233 int numelem_elt = get_scalar_idx (elt_idx, this_dims); |
2234 | 2234 |
2235 if (numelem_elt > length () || numelem_elt < 0) | 2235 if (numelem_elt > length () || numelem_elt < 0) |
2236 (*current_liboctave_error_handler) | 2236 (*current_liboctave_error_handler) |
2400 int lhs_nr = lhs.rows (); | 2400 int lhs_nr = lhs.rows (); |
2401 int lhs_nc = lhs.cols (); | 2401 int lhs_nc = lhs.cols (); |
2402 | 2402 |
2403 int rhs_nr = rhs.rows (); | 2403 int rhs_nr = rhs.rows (); |
2404 int rhs_nc = rhs.cols (); | 2404 int rhs_nc = rhs.cols (); |
2405 | 2405 |
2406 if (rhs.length () > 2) | 2406 if (rhs.length () > 2) |
2407 { | 2407 { |
2408 dim_vector dv_tmp = rhs.squeeze().dims (); | 2408 dim_vector dv_tmp = rhs.squeeze().dims (); |
2409 | 2409 |
2410 switch (dv_tmp.length ()) | 2410 switch (dv_tmp.length ()) |
2965 | 2965 |
2966 lhs.resize (final_lhs_dims); | 2966 lhs.resize (final_lhs_dims); |
2967 } | 2967 } |
2968 | 2968 |
2969 lhs.chop_trailing_singletons (); | 2969 lhs.chop_trailing_singletons (); |
2970 | 2970 |
2971 lhs.clear_index (); | 2971 lhs.clear_index (); |
2972 | 2972 |
2973 return retval; | 2973 return retval; |
2974 } | 2974 } |
2975 | 2975 |