comparison liboctave/intNDArray.cc @ 6979:2883ea1c5c18

[project @ 2007-10-08 20:23:48 by dbateman]
author dbateman
date Mon, 08 Oct 2007 20:26:01 +0000
parents 7e958a1532c6
children 93c65f2a5668
comparison
equal deleted inserted replaced
6978:b75630794a11 6979:2883ea1c5c18
57 if (val != 0.0 && val != 1.0) 57 if (val != 0.0 && val != 1.0)
58 return true; 58 return true;
59 } 59 }
60 60
61 return false; 61 return false;
62 }
63
64
65 template <class T>
66 intNDArray<T>
67 intNDArray<T>::diag (void) const
68 {
69 return diag (0);
70 }
71
72 template <class T>
73 intNDArray<T>
74 intNDArray<T>::diag (octave_idx_type k) const
75 {
76 dim_vector dv = this->dims ();
77 octave_idx_type nd = dv.length ();
78
79 if (nd > 2)
80 {
81 (*current_liboctave_error_handler) ("Matrix must be 2-dimensional");
82 return intNDArray<T>();
83 }
84 else
85 {
86 octave_idx_type nnr = dv (0);
87 octave_idx_type nnc = dv (1);
88
89 if (k > 0)
90 nnc -= k;
91 else if (k < 0)
92 nnr += k;
93
94 intNDArray<T> d;
95
96 if (nnr > 0 && nnc > 0)
97 {
98 octave_idx_type ndiag = (nnr < nnc) ? nnr : nnc;
99
100 d.resize (dim_vector (ndiag, 1));
101
102 if (k > 0)
103 {
104 for (octave_idx_type i = 0; i < ndiag; i++)
105 d.xelem (i) = this->elem (i, i+k);
106 }
107 else if (k < 0)
108 {
109 for (octave_idx_type i = 0; i < ndiag; i++)
110 d.xelem (i) = this->elem (i-k, i);
111 }
112 else
113 {
114 for (octave_idx_type i = 0; i < ndiag; i++)
115 d.xelem (i) = this->elem (i, i);
116 }
117 }
118 else
119 (*current_liboctave_error_handler)
120 ("diag: requested diagonal out of range");
121
122 return d;
123 }
62 } 124 }
63 125
64 // FIXME -- this is not quite the right thing. 126 // FIXME -- this is not quite the right thing.
65 127
66 template <class T> 128 template <class T>