Mercurial > hg > octave-lyh
comparison liboctave/Array.cc @ 10314:07ebe522dac2
untabify liboctave C++ sources
author | John W. Eaton <jwe@octave.org> |
---|---|
date | Thu, 11 Feb 2010 12:23:32 -0500 |
parents | 6ffed9bb5598 |
children | 12884915a8e4 |
comparison
equal
deleted
inserted
replaced
10313:f3b65e1ae355 | 10314:07ebe522dac2 |
---|---|
124 dim_vector new_dimensions = dimensions; | 124 dim_vector new_dimensions = dimensions; |
125 | 125 |
126 int k = 0; | 126 int k = 0; |
127 | 127 |
128 for (int i = 0; i < ndims (); i++) | 128 for (int i = 0; i < ndims (); i++) |
129 { | 129 { |
130 if (dimensions(i) == 1) | 130 if (dimensions(i) == 1) |
131 dims_changed = true; | 131 dims_changed = true; |
132 else | 132 else |
133 new_dimensions(k++) = dimensions(i); | 133 new_dimensions(k++) = dimensions(i); |
134 } | 134 } |
135 | 135 |
136 if (dims_changed) | 136 if (dims_changed) |
137 { | 137 { |
138 switch (k) | 138 switch (k) |
139 { | 139 { |
140 case 0: | 140 case 0: |
141 new_dimensions = dim_vector (1, 1); | 141 new_dimensions = dim_vector (1, 1); |
142 break; | 142 break; |
143 | 143 |
144 case 1: | 144 case 1: |
145 { | 145 { |
146 octave_idx_type tmp = new_dimensions(0); | 146 octave_idx_type tmp = new_dimensions(0); |
147 | 147 |
148 new_dimensions.resize (2); | 148 new_dimensions.resize (2); |
149 | 149 |
150 new_dimensions(0) = tmp; | 150 new_dimensions(0) = tmp; |
151 new_dimensions(1) = 1; | 151 new_dimensions(1) = 1; |
152 } | 152 } |
153 break; | 153 break; |
154 | 154 |
155 default: | 155 default: |
156 new_dimensions.resize (k); | 156 new_dimensions.resize (k); |
157 break; | 157 break; |
158 } | 158 } |
159 } | 159 } |
160 | 160 |
161 retval = Array<T> (*this, new_dimensions); | 161 retval = Array<T> (*this, new_dimensions); |
162 } | 162 } |
163 | 163 |
164 return retval; | 164 return retval; |
446 // Find dimension vector of permuted array. | 446 // Find dimension vector of permuted array. |
447 for (int i = 0; i < perm_vec_len; i++) | 447 for (int i = 0; i < perm_vec_len; i++) |
448 { | 448 { |
449 octave_idx_type perm_elt = perm_vec.elem (i); | 449 octave_idx_type perm_elt = perm_vec.elem (i); |
450 if (perm_elt >= perm_vec_len || perm_elt < 0) | 450 if (perm_elt >= perm_vec_len || perm_elt < 0) |
451 { | 451 { |
452 (*current_liboctave_error_handler) | 452 (*current_liboctave_error_handler) |
453 ("%s: permutation vector contains an invalid element", | 453 ("%s: permutation vector contains an invalid element", |
454 inv ? "ipermute" : "permute"); | 454 inv ? "ipermute" : "permute"); |
455 | 455 |
456 return retval; | 456 return retval; |
457 } | 457 } |
458 | 458 |
459 if (checked[perm_elt]) | 459 if (checked[perm_elt]) |
460 { | 460 { |
461 (*current_liboctave_error_handler) | 461 (*current_liboctave_error_handler) |
462 ("%s: permutation vector cannot contain identical elements", | 462 ("%s: permutation vector cannot contain identical elements", |
463 inv ? "ipermute" : "permute"); | 463 inv ? "ipermute" : "permute"); |
464 | 464 |
465 return retval; | 465 return retval; |
466 } | 466 } |
467 else | 467 else |
468 { | 468 { |
469 checked[perm_elt] = true; | 469 checked[perm_elt] = true; |
470 identity = identity && perm_elt == i; | 470 identity = identity && perm_elt == i; |
471 } | 471 } |
1188 | 1188 |
1189 bool isfill = rhs.numel () == 1; | 1189 bool isfill = rhs.numel () == 1; |
1190 octave_idx_type il = i.length (rdv(0)), jl = j.length (rdv(1)); | 1190 octave_idx_type il = i.length (rdv(0)), jl = j.length (rdv(1)); |
1191 rhdv.chop_all_singletons (); | 1191 rhdv.chop_all_singletons (); |
1192 bool match = (isfill | 1192 bool match = (isfill |
1193 || (rhdv.length () == 2 && il == rhdv(0) && jl == rhdv(1))); | 1193 || (rhdv.length () == 2 && il == rhdv(0) && jl == rhdv(1))); |
1194 match = match || (il == 1 && jl == rhdv(0) && rhdv(1) == 1); | 1194 match = match || (il == 1 && jl == rhdv(0) && rhdv(1) == 1); |
1195 | 1195 |
1196 if (match) | 1196 if (match) |
1197 { | 1197 { |
1198 bool all_colons = (i.is_colon_equiv (rdv(0)) | 1198 bool all_colons = (i.is_colon_equiv (rdv(0)) |
1553 else if (nr > 1 && nc > 1) | 1553 else if (nr > 1 && nc > 1) |
1554 { | 1554 { |
1555 Array<T> result (dim_vector (nc, nr)); | 1555 Array<T> result (dim_vector (nc, nr)); |
1556 | 1556 |
1557 for (octave_idx_type j = 0; j < nc; j++) | 1557 for (octave_idx_type j = 0; j < nc; j++) |
1558 for (octave_idx_type i = 0; i < nr; i++) | 1558 for (octave_idx_type i = 0; i < nr; i++) |
1559 result.xelem (j, i) = xelem (i, j); | 1559 result.xelem (j, i) = xelem (i, j); |
1560 | 1560 |
1561 return result; | 1561 return result; |
1562 } | 1562 } |
1563 else | 1563 else |
1564 { | 1564 { |
1596 // on some compilers. | 1596 // on some compilers. |
1597 T buf[64]; | 1597 T buf[64]; |
1598 | 1598 |
1599 octave_idx_type ii = 0, jj; | 1599 octave_idx_type ii = 0, jj; |
1600 for (jj = 0; jj < (nc - 8 + 1); jj += 8) | 1600 for (jj = 0; jj < (nc - 8 + 1); jj += 8) |
1601 { | 1601 { |
1602 for (ii = 0; ii < (nr - 8 + 1); ii += 8) | 1602 for (ii = 0; ii < (nr - 8 + 1); ii += 8) |
1603 { | 1603 { |
1604 // Copy to buffer | 1604 // Copy to buffer |
1605 for (octave_idx_type j = jj, k = 0, idxj = jj * nr; | 1605 for (octave_idx_type j = jj, k = 0, idxj = jj * nr; |
1606 j < jj + 8; j++, idxj += nr) | 1606 j < jj + 8; j++, idxj += nr) |
1607 for (octave_idx_type i = ii; i < ii + 8; i++) | 1607 for (octave_idx_type i = ii; i < ii + 8; i++) |
1608 buf[k++] = xelem (i + idxj); | 1608 buf[k++] = xelem (i + idxj); |
1609 | 1609 |
1610 // Copy from buffer | 1610 // Copy from buffer |
1611 for (octave_idx_type i = ii, idxi = ii * nc; i < ii + 8; | 1611 for (octave_idx_type i = ii, idxi = ii * nc; i < ii + 8; |
1612 i++, idxi += nc) | 1612 i++, idxi += nc) |
1613 for (octave_idx_type j = jj, k = i - ii; j < jj + 8; | 1613 for (octave_idx_type j = jj, k = i - ii; j < jj + 8; |
1614 j++, k+=8) | 1614 j++, k+=8) |
1615 result.xelem (j + idxi) = fcn (buf[k]); | 1615 result.xelem (j + idxi) = fcn (buf[k]); |
1616 } | 1616 } |
1617 | 1617 |
1618 if (ii < nr) | 1618 if (ii < nr) |
1619 for (octave_idx_type j = jj; j < jj + 8; j++) | 1619 for (octave_idx_type j = jj; j < jj + 8; j++) |
1620 for (octave_idx_type i = ii; i < nr; i++) | 1620 for (octave_idx_type i = ii; i < nr; i++) |
1621 result.xelem (j, i) = fcn (xelem (i, j)); | 1621 result.xelem (j, i) = fcn (xelem (i, j)); |
1622 } | 1622 } |
1623 | 1623 |
1624 for (octave_idx_type j = jj; j < nc; j++) | 1624 for (octave_idx_type j = jj; j < nc; j++) |
1625 for (octave_idx_type i = 0; i < nr; i++) | 1625 for (octave_idx_type i = 0; i < nr; i++) |
1626 result.xelem (j, i) = fcn (xelem (i, j)); | 1626 result.xelem (j, i) = fcn (xelem (i, j)); |
1627 | 1627 |
1628 return result; | 1628 return result; |
1629 } | 1629 } |
1630 else | 1630 else |
1631 { | 1631 { |
1632 Array<T> result (dim_vector (nc, nr)); | 1632 Array<T> result (dim_vector (nc, nr)); |
1633 | 1633 |
1634 for (octave_idx_type j = 0; j < nc; j++) | 1634 for (octave_idx_type j = 0; j < nc; j++) |
1635 for (octave_idx_type i = 0; i < nr; i++) | 1635 for (octave_idx_type i = 0; i < nr; i++) |
1636 result.xelem (j, i) = fcn (xelem (i, j)); | 1636 result.xelem (j, i) = fcn (xelem (i, j)); |
1637 | 1637 |
1638 return result; | 1638 return result; |
1639 } | 1639 } |
1640 } | 1640 } |
1641 | 1641 |
1695 for (int i = nd - 1; i >= 0; i--) | 1695 for (int i = nd - 1; i >= 0; i--) |
1696 { | 1696 { |
1697 if (delete_dims) | 1697 if (delete_dims) |
1698 { | 1698 { |
1699 if (dimensions(i) != 1) | 1699 if (dimensions(i) != 1) |
1700 { | 1700 { |
1701 delete_dims = false; | 1701 delete_dims = false; |
1702 | 1702 |
1703 new_dims = dim_vector (i + 1, dimensions(i)); | 1703 new_dims = dim_vector (i + 1, dimensions(i)); |
1704 } | 1704 } |
1705 } | 1705 } |
1706 else | 1706 else |
1707 new_dims(i) = dimensions(i); | 1707 new_dims(i) = dimensions(i); |
1708 } | 1708 } |
1709 | 1709 |
1710 if (nd != new_dims.length ()) | 1710 if (nd != new_dims.length ()) |
1711 dimensions = new_dims; | 1711 dimensions = new_dims; |
1712 } | 1712 } |
1755 return m; | 1755 return m; |
1756 | 1756 |
1757 if (stride == 1) | 1757 if (stride == 1) |
1758 { | 1758 { |
1759 for (octave_idx_type j = 0; j < iter; j++) | 1759 for (octave_idx_type j = 0; j < iter; j++) |
1760 { | 1760 { |
1761 // copy and partition out NaNs. | 1761 // copy and partition out NaNs. |
1762 // FIXME: impact on integer types noticeable? | 1762 // FIXME: impact on integer types noticeable? |
1763 octave_idx_type kl = 0, ku = ns; | 1763 octave_idx_type kl = 0, ku = ns; |
1764 for (octave_idx_type i = 0; i < ns; i++) | 1764 for (octave_idx_type i = 0; i < ns; i++) |
1765 { | 1765 { |
1769 else | 1769 else |
1770 v[kl++] = tmp; | 1770 v[kl++] = tmp; |
1771 } | 1771 } |
1772 | 1772 |
1773 // sort. | 1773 // sort. |
1774 lsort.sort (v, kl); | 1774 lsort.sort (v, kl); |
1775 | 1775 |
1776 if (ku < ns) | 1776 if (ku < ns) |
1777 { | 1777 { |
1778 // NaNs are in reverse order | 1778 // NaNs are in reverse order |
1779 std::reverse (v + ku, v + ns); | 1779 std::reverse (v + ku, v + ns); |
1780 if (mode == DESCENDING) | 1780 if (mode == DESCENDING) |
1781 std::rotate (v, v + ku, v + ns); | 1781 std::rotate (v, v + ku, v + ns); |
1782 } | 1782 } |
1783 | 1783 |
1784 v += ns; | 1784 v += ns; |
1785 ov += ns; | 1785 ov += ns; |
1786 } | 1786 } |
1787 } | 1787 } |
1788 else | 1788 else |
1789 { | 1789 { |
1790 OCTAVE_LOCAL_BUFFER (T, buf, ns); | 1790 OCTAVE_LOCAL_BUFFER (T, buf, ns); |
1791 | 1791 |
1792 for (octave_idx_type j = 0; j < iter; j++) | 1792 for (octave_idx_type j = 0; j < iter; j++) |
1793 { | 1793 { |
1794 octave_idx_type offset = j; | 1794 octave_idx_type offset = j; |
1795 octave_idx_type offset2 = 0; | 1795 octave_idx_type offset2 = 0; |
1796 | 1796 |
1797 while (offset >= stride) | 1797 while (offset >= stride) |
1798 { | 1798 { |
1799 offset -= stride; | 1799 offset -= stride; |
1800 offset2++; | 1800 offset2++; |
1801 } | 1801 } |
1802 | 1802 |
1803 offset += offset2 * stride * ns; | 1803 offset += offset2 * stride * ns; |
1804 | 1804 |
1805 // gather and partition out NaNs. | 1805 // gather and partition out NaNs. |
1806 // FIXME: impact on integer types noticeable? | 1806 // FIXME: impact on integer types noticeable? |
1807 octave_idx_type kl = 0, ku = ns; | 1807 octave_idx_type kl = 0, ku = ns; |
1808 for (octave_idx_type i = 0; i < ns; i++) | 1808 for (octave_idx_type i = 0; i < ns; i++) |
1809 { | 1809 { |
1813 else | 1813 else |
1814 buf[kl++] = tmp; | 1814 buf[kl++] = tmp; |
1815 } | 1815 } |
1816 | 1816 |
1817 // sort. | 1817 // sort. |
1818 lsort.sort (buf, kl); | 1818 lsort.sort (buf, kl); |
1819 | 1819 |
1820 if (ku < ns) | 1820 if (ku < ns) |
1821 { | 1821 { |
1822 // NaNs are in reverse order | 1822 // NaNs are in reverse order |
1823 std::reverse (buf + ku, buf + ns); | 1823 std::reverse (buf + ku, buf + ns); |
1824 if (mode == DESCENDING) | 1824 if (mode == DESCENDING) |
1825 std::rotate (buf, buf + ku, buf + ns); | 1825 std::rotate (buf, buf + ku, buf + ns); |
1826 } | 1826 } |
1827 | 1827 |
1828 // scatter. | 1828 // scatter. |
1829 for (octave_idx_type i = 0; i < ns; i++) | 1829 for (octave_idx_type i = 0; i < ns; i++) |
1830 v[i*stride + offset] = buf[i]; | 1830 v[i*stride + offset] = buf[i]; |
1831 } | 1831 } |
1832 } | 1832 } |
1833 | 1833 |
1834 return m; | 1834 return m; |
1835 } | 1835 } |
1836 | 1836 |
1837 template <class T> | 1837 template <class T> |
1838 Array<T> | 1838 Array<T> |
1839 Array<T>::sort (Array<octave_idx_type> &sidx, int dim, | 1839 Array<T>::sort (Array<octave_idx_type> &sidx, int dim, |
1840 sortmode mode) const | 1840 sortmode mode) const |
1841 { | 1841 { |
1842 if (dim < 0 || dim >= ndims ()) | 1842 if (dim < 0 || dim >= ndims ()) |
1843 { | 1843 { |
1844 (*current_liboctave_error_handler) | 1844 (*current_liboctave_error_handler) |
1845 ("sort: invalid dimension"); | 1845 ("sort: invalid dimension"); |
1877 return m; | 1877 return m; |
1878 | 1878 |
1879 if (stride == 1) | 1879 if (stride == 1) |
1880 { | 1880 { |
1881 for (octave_idx_type j = 0; j < iter; j++) | 1881 for (octave_idx_type j = 0; j < iter; j++) |
1882 { | 1882 { |
1883 // copy and partition out NaNs. | 1883 // copy and partition out NaNs. |
1884 // FIXME: impact on integer types noticeable? | 1884 // FIXME: impact on integer types noticeable? |
1885 octave_idx_type kl = 0, ku = ns; | 1885 octave_idx_type kl = 0, ku = ns; |
1886 for (octave_idx_type i = 0; i < ns; i++) | 1886 for (octave_idx_type i = 0; i < ns; i++) |
1887 { | 1887 { |
1899 kl++; | 1899 kl++; |
1900 } | 1900 } |
1901 } | 1901 } |
1902 | 1902 |
1903 // sort. | 1903 // sort. |
1904 lsort.sort (v, vi, kl); | 1904 lsort.sort (v, vi, kl); |
1905 | 1905 |
1906 if (ku < ns) | 1906 if (ku < ns) |
1907 { | 1907 { |
1908 // NaNs are in reverse order | 1908 // NaNs are in reverse order |
1909 std::reverse (v + ku, v + ns); | 1909 std::reverse (v + ku, v + ns); |
1913 std::rotate (v, v + ku, v + ns); | 1913 std::rotate (v, v + ku, v + ns); |
1914 std::rotate (vi, vi + ku, vi + ns); | 1914 std::rotate (vi, vi + ku, vi + ns); |
1915 } | 1915 } |
1916 } | 1916 } |
1917 | 1917 |
1918 v += ns; | 1918 v += ns; |
1919 vi += ns; | 1919 vi += ns; |
1920 ov += ns; | 1920 ov += ns; |
1921 } | 1921 } |
1922 } | 1922 } |
1923 else | 1923 else |
1924 { | 1924 { |
1925 OCTAVE_LOCAL_BUFFER (T, buf, ns); | 1925 OCTAVE_LOCAL_BUFFER (T, buf, ns); |
1926 OCTAVE_LOCAL_BUFFER (octave_idx_type, bufi, ns); | 1926 OCTAVE_LOCAL_BUFFER (octave_idx_type, bufi, ns); |
1927 | 1927 |
1928 for (octave_idx_type j = 0; j < iter; j++) | 1928 for (octave_idx_type j = 0; j < iter; j++) |
1929 { | 1929 { |
1930 octave_idx_type offset = j; | 1930 octave_idx_type offset = j; |
1931 octave_idx_type offset2 = 0; | 1931 octave_idx_type offset2 = 0; |
1932 | 1932 |
1933 while (offset >= stride) | 1933 while (offset >= stride) |
1934 { | 1934 { |
1935 offset -= stride; | 1935 offset -= stride; |
1936 offset2++; | 1936 offset2++; |
1937 } | 1937 } |
1938 | 1938 |
1939 offset += offset2 * stride * ns; | 1939 offset += offset2 * stride * ns; |
1940 | 1940 |
1941 // gather and partition out NaNs. | 1941 // gather and partition out NaNs. |
1942 // FIXME: impact on integer types noticeable? | 1942 // FIXME: impact on integer types noticeable? |
1943 octave_idx_type kl = 0, ku = ns; | 1943 octave_idx_type kl = 0, ku = ns; |
1944 for (octave_idx_type i = 0; i < ns; i++) | 1944 for (octave_idx_type i = 0; i < ns; i++) |
1945 { | 1945 { |
1957 kl++; | 1957 kl++; |
1958 } | 1958 } |
1959 } | 1959 } |
1960 | 1960 |
1961 // sort. | 1961 // sort. |
1962 lsort.sort (buf, bufi, kl); | 1962 lsort.sort (buf, bufi, kl); |
1963 | 1963 |
1964 if (ku < ns) | 1964 if (ku < ns) |
1965 { | 1965 { |
1966 // NaNs are in reverse order | 1966 // NaNs are in reverse order |
1967 std::reverse (buf + ku, buf + ns); | 1967 std::reverse (buf + ku, buf + ns); |
1972 std::rotate (bufi, bufi + ku, bufi + ns); | 1972 std::rotate (bufi, bufi + ku, bufi + ns); |
1973 } | 1973 } |
1974 } | 1974 } |
1975 | 1975 |
1976 // scatter. | 1976 // scatter. |
1977 for (octave_idx_type i = 0; i < ns; i++) | 1977 for (octave_idx_type i = 0; i < ns; i++) |
1978 v[i*stride + offset] = buf[i]; | 1978 v[i*stride + offset] = buf[i]; |
1979 for (octave_idx_type i = 0; i < ns; i++) | 1979 for (octave_idx_type i = 0; i < ns; i++) |
1980 vi[i*stride + offset] = bufi[i]; | 1980 vi[i*stride + offset] = bufi[i]; |
1981 } | 1981 } |
1982 } | 1982 } |
1983 | 1983 |
1984 return m; | 1984 return m; |
1985 } | 1985 } |
1986 | 1986 |
2010 | 2010 |
2011 if (! mode) | 2011 if (! mode) |
2012 { | 2012 { |
2013 // Auto-detect mode. | 2013 // Auto-detect mode. |
2014 compare_fcn_type compare | 2014 compare_fcn_type compare |
2015 = safe_comparator (ASCENDING, *this, false); | 2015 = safe_comparator (ASCENDING, *this, false); |
2016 | 2016 |
2017 if (compare (elem (n-1), elem (0))) | 2017 if (compare (elem (n-1), elem (0))) |
2018 mode = DESCENDING; | 2018 mode = DESCENDING; |
2019 else | 2019 else |
2020 mode = ASCENDING; | 2020 mode = ASCENDING; |
2063 | 2063 |
2064 if (! mode) | 2064 if (! mode) |
2065 { | 2065 { |
2066 // Auto-detect mode. | 2066 // Auto-detect mode. |
2067 compare_fcn_type compare | 2067 compare_fcn_type compare |
2068 = safe_comparator (ASCENDING, *this, false); | 2068 = safe_comparator (ASCENDING, *this, false); |
2069 | 2069 |
2070 octave_idx_type i; | 2070 octave_idx_type i; |
2071 for (i = 0; i < cols (); i++) | 2071 for (i = 0; i < cols (); i++) |
2072 { | 2072 { |
2073 T l = elem (0, i), u = elem (rows () - 1, i); | 2073 T l = elem (0, i), u = elem (rows () - 1, i); |
2476 { | 2476 { |
2477 octave_idx_type nnr = dv (0); | 2477 octave_idx_type nnr = dv (0); |
2478 octave_idx_type nnc = dv (1); | 2478 octave_idx_type nnc = dv (1); |
2479 | 2479 |
2480 if (nnr == 0 || nnc == 0) | 2480 if (nnr == 0 || nnc == 0) |
2481 ; // do nothing | 2481 ; // do nothing |
2482 else if (nnr != 1 && nnc != 1) | 2482 else if (nnr != 1 && nnc != 1) |
2483 { | 2483 { |
2484 if (k > 0) | 2484 if (k > 0) |
2485 nnc -= k; | 2485 nnc -= k; |
2486 else if (k < 0) | 2486 else if (k < 0) |
2487 nnr += k; | 2487 nnr += k; |
2488 | 2488 |
2489 if (nnr > 0 && nnc > 0) | 2489 if (nnr > 0 && nnc > 0) |
2490 { | 2490 { |
2491 octave_idx_type ndiag = (nnr < nnc) ? nnr : nnc; | 2491 octave_idx_type ndiag = (nnr < nnc) ? nnr : nnc; |
2492 | 2492 |
2493 d.resize (dim_vector (ndiag, 1)); | 2493 d.resize (dim_vector (ndiag, 1)); |
2494 | 2494 |
2495 if (k > 0) | 2495 if (k > 0) |
2496 { | 2496 { |
2497 for (octave_idx_type i = 0; i < ndiag; i++) | 2497 for (octave_idx_type i = 0; i < ndiag; i++) |
2498 d.xelem (i) = elem (i, i+k); | 2498 d.xelem (i) = elem (i, i+k); |
2499 } | 2499 } |
2500 else if (k < 0) | 2500 else if (k < 0) |
2501 { | 2501 { |
2502 for (octave_idx_type i = 0; i < ndiag; i++) | 2502 for (octave_idx_type i = 0; i < ndiag; i++) |
2503 d.xelem (i) = elem (i-k, i); | 2503 d.xelem (i) = elem (i-k, i); |
2504 } | 2504 } |
2505 else | 2505 else |
2506 { | 2506 { |
2507 for (octave_idx_type i = 0; i < ndiag; i++) | 2507 for (octave_idx_type i = 0; i < ndiag; i++) |
2508 d.xelem (i) = elem (i, i); | 2508 d.xelem (i) = elem (i, i); |
2509 } | 2509 } |
2510 } | 2510 } |
2511 else | 2511 else |
2512 (*current_liboctave_error_handler) | 2512 (*current_liboctave_error_handler) |
2513 ("diag: requested diagonal out of range"); | 2513 ("diag: requested diagonal out of range"); |
2514 } | 2514 } |
2515 else if (nnr != 0 && nnc != 0) | 2515 else if (nnr != 0 && nnc != 0) |
2516 { | 2516 { |
2517 octave_idx_type roff = 0; | 2517 octave_idx_type roff = 0; |
2518 octave_idx_type coff = 0; | 2518 octave_idx_type coff = 0; |
2519 if (k > 0) | 2519 if (k > 0) |
2520 { | 2520 { |
2521 roff = 0; | 2521 roff = 0; |
2522 coff = k; | 2522 coff = k; |
2523 } | 2523 } |
2524 else if (k < 0) | 2524 else if (k < 0) |
2525 { | 2525 { |
2526 roff = -k; | 2526 roff = -k; |
2527 coff = 0; | 2527 coff = 0; |
2528 } | 2528 } |
2529 | 2529 |
2530 if (nnr == 1) | 2530 if (nnr == 1) |
2531 { | 2531 { |
2532 octave_idx_type n = nnc + std::abs (k); | 2532 octave_idx_type n = nnc + std::abs (k); |
2533 d = Array<T> (dim_vector (n, n), resize_fill_value ()); | 2533 d = Array<T> (dim_vector (n, n), resize_fill_value ()); |
2534 | 2534 |
2535 for (octave_idx_type i = 0; i < nnc; i++) | 2535 for (octave_idx_type i = 0; i < nnc; i++) |
2536 d.xelem (i+roff, i+coff) = elem (0, i); | 2536 d.xelem (i+roff, i+coff) = elem (0, i); |
2537 } | 2537 } |
2538 else | 2538 else |
2539 { | 2539 { |
2540 octave_idx_type n = nnr + std::abs (k); | 2540 octave_idx_type n = nnr + std::abs (k); |
2541 d = Array<T> (dim_vector (n, n), resize_fill_value ()); | 2541 d = Array<T> (dim_vector (n, n), resize_fill_value ()); |
2542 | 2542 |
2543 for (octave_idx_type i = 0; i < nnr; i++) | 2543 for (octave_idx_type i = 0; i < nnr; i++) |
2544 d.xelem (i+roff, i+coff) = elem (i, 0); | 2544 d.xelem (i+roff, i+coff) = elem (i, 0); |
2545 } | 2545 } |
2546 } | 2546 } |
2547 } | 2547 } |
2548 | 2548 |
2549 return d; | 2549 return d; |
2550 } | 2550 } |
2551 | 2551 |
2603 | 2603 |
2604 // Number of times the first 2d-array is to be displayed. | 2604 // Number of times the first 2d-array is to be displayed. |
2605 | 2605 |
2606 octave_idx_type m = 1; | 2606 octave_idx_type m = 1; |
2607 for (int i = 2; i < n_dims; i++) | 2607 for (int i = 2; i < n_dims; i++) |
2608 m *= a_dims(i); | 2608 m *= a_dims(i); |
2609 | 2609 |
2610 if (m == 1) | 2610 if (m == 1) |
2611 { | 2611 { |
2612 octave_idx_type rows = 0; | 2612 octave_idx_type rows = 0; |
2613 octave_idx_type cols = 0; | 2613 octave_idx_type cols = 0; |
2614 | 2614 |
2615 switch (n_dims) | 2615 switch (n_dims) |
2616 { | 2616 { |
2617 case 2: | 2617 case 2: |
2618 rows = a_dims(0); | 2618 rows = a_dims(0); |
2619 cols = a_dims(1); | 2619 cols = a_dims(1); |
2620 | 2620 |
2621 for (octave_idx_type j = 0; j < rows; j++) | 2621 for (octave_idx_type j = 0; j < rows; j++) |
2622 { | 2622 { |
2623 ra_idx(0) = j; | 2623 ra_idx(0) = j; |
2624 for (octave_idx_type k = 0; k < cols; k++) | 2624 for (octave_idx_type k = 0; k < cols; k++) |
2625 { | 2625 { |
2626 ra_idx(1) = k; | 2626 ra_idx(1) = k; |
2627 os << " " << a.elem(ra_idx); | 2627 os << " " << a.elem(ra_idx); |
2628 } | 2628 } |
2629 os << "\n"; | 2629 os << "\n"; |
2630 } | 2630 } |
2631 break; | 2631 break; |
2632 | 2632 |
2633 default: | 2633 default: |
2634 rows = a_dims(0); | 2634 rows = a_dims(0); |
2635 | 2635 |
2636 for (octave_idx_type k = 0; k < rows; k++) | 2636 for (octave_idx_type k = 0; k < rows; k++) |
2637 { | 2637 { |
2638 ra_idx(0) = k; | 2638 ra_idx(0) = k; |
2639 os << " " << a.elem(ra_idx); | 2639 os << " " << a.elem(ra_idx); |
2640 } | 2640 } |
2641 break; | 2641 break; |
2642 } | 2642 } |
2643 | 2643 |
2644 os << "\n"; | 2644 os << "\n"; |
2645 } | 2645 } |
2646 else | 2646 else |
2647 { | 2647 { |
2651 for (int i = 0; i < m; i++) | 2651 for (int i = 0; i < m; i++) |
2652 { | 2652 { |
2653 os << "\n(:,:,"; | 2653 os << "\n(:,:,"; |
2654 | 2654 |
2655 for (int j = 2; j < n_dims - 1; j++) | 2655 for (int j = 2; j < n_dims - 1; j++) |
2656 os << ra_idx(j) + 1 << ","; | 2656 os << ra_idx(j) + 1 << ","; |
2657 | 2657 |
2658 os << ra_idx(n_dims - 1) + 1 << ") = \n"; | 2658 os << ra_idx(n_dims - 1) + 1 << ") = \n"; |
2659 | 2659 |
2660 for (octave_idx_type j = 0; j < rows; j++) | 2660 for (octave_idx_type j = 0; j < rows; j++) |
2661 { | 2661 { |
2662 ra_idx(0) = j; | 2662 ra_idx(0) = j; |
2663 | 2663 |
2664 for (octave_idx_type k = 0; k < cols; k++) | 2664 for (octave_idx_type k = 0; k < cols; k++) |
2665 { | 2665 { |
2666 ra_idx(1) = k; | 2666 ra_idx(1) = k; |
2667 os << " " << a.elem(ra_idx); | 2667 os << " " << a.elem(ra_idx); |
2668 } | 2668 } |
2669 | 2669 |
2670 os << "\n"; | 2670 os << "\n"; |
2671 } | 2671 } |
2672 | 2672 |
2673 os << "\n"; | 2673 os << "\n"; |
2674 | 2674 |
2675 if (i != m - 1) | 2675 if (i != m - 1) |
2676 increment_index (ra_idx, a_dims, 2); | 2676 increment_index (ra_idx, a_dims, 2); |
2677 } | 2677 } |
2678 } | 2678 } |
2679 } | 2679 } |
2680 | 2680 |
2681 return os; | 2681 return os; |