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