Mercurial > hg > octave-nkf
annotate src/DLD-FUNCTIONS/kron.cc @ 7455:fe332ce262b5
eliminate spkron.cc; dispatch in kron
author | David Bateman <dbateman@free.fr> |
---|---|
date | Thu, 07 Feb 2008 06:00:37 -0500 |
parents | a1dbe9d80eee |
children | 82be108cc558 |
rev | line source |
---|---|
3910 | 1 /* |
2 | |
7017 | 3 Copyright (C) 2002, 2005, 2006, 2007 John W. Eaton |
3910 | 4 |
5 This file is part of Octave. | |
6 | |
7 Octave is free software; you can redistribute it and/or modify it | |
8 under the terms of the GNU General Public License as published by the | |
7016 | 9 Free Software Foundation; either version 3 of the License, or (at your |
10 option) any later version. | |
3910 | 11 |
12 Octave is distributed in the hope that it will be useful, but WITHOUT | |
13 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
14 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
15 for more details. | |
16 | |
17 You should have received a copy of the GNU General Public License | |
7016 | 18 along with Octave; see the file COPYING. If not, see |
19 <http://www.gnu.org/licenses/>. | |
3910 | 20 |
21 */ | |
22 | |
3911 | 23 // Author: Paul Kienzle <pkienzle@users.sf.net> |
24 | |
3910 | 25 #ifdef HAVE_CONFIG_H |
26 #include <config.h> | |
27 #endif | |
28 | |
29 #include "dMatrix.h" | |
30 #include "CMatrix.h" | |
4153 | 31 #include "quit.h" |
3910 | 32 |
33 #include "defun-dld.h" | |
34 #include "error.h" | |
35 #include "oct-obj.h" | |
36 | |
37 #if !defined (CXX_NEW_FRIEND_TEMPLATE_DECL) | |
38 extern void | |
39 kron (const Array2<double>&, const Array2<double>&, Array2<double>&); | |
40 | |
41 extern void | |
42 kron (const Array2<Complex>&, const Array2<Complex>&, Array2<Complex>&); | |
43 #endif | |
44 | |
45 template <class T> | |
46 void | |
47 kron (const Array2<T>& A, const Array2<T>& B, Array2<T>& C) | |
48 { | |
49 C.resize (A.rows () * B.rows (), A.columns () * B.columns ()); | |
50 | |
5275 | 51 octave_idx_type Ac, Ar, Cc, Cr; |
3910 | 52 |
53 for (Ac = Cc = 0; Ac < A.columns (); Ac++, Cc += B.columns ()) | |
54 for (Ar = Cr = 0; Ar < A.rows (); Ar++, Cr += B.rows ()) | |
55 { | |
56 const T v = A (Ar, Ac); | |
5275 | 57 for (octave_idx_type Bc = 0; Bc < B.columns (); Bc++) |
58 for (octave_idx_type Br = 0; Br < B.rows (); Br++) | |
4153 | 59 { |
60 OCTAVE_QUIT; | |
61 C.xelem (Cr+Br, Cc+Bc) = v * B.elem (Br, Bc); | |
62 } | |
3910 | 63 } |
64 } | |
65 | |
66 template void | |
67 kron (const Array2<double>&, const Array2<double>&, Array2<double>&); | |
68 | |
69 template void | |
70 kron (const Array2<Complex>&, const Array2<Complex>&, Array2<Complex>&); | |
71 | |
7455
fe332ce262b5
eliminate spkron.cc; dispatch in kron
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
72 |
fe332ce262b5
eliminate spkron.cc; dispatch in kron
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
73 #if !defined (CXX_NEW_FRIEND_TEMPLATE_DECL) |
fe332ce262b5
eliminate spkron.cc; dispatch in kron
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
74 extern void |
fe332ce262b5
eliminate spkron.cc; dispatch in kron
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
75 kron (const Sparse<double>&, const Sparse<double>&, Sparse<double>&); |
fe332ce262b5
eliminate spkron.cc; dispatch in kron
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
76 |
fe332ce262b5
eliminate spkron.cc; dispatch in kron
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
77 extern void |
fe332ce262b5
eliminate spkron.cc; dispatch in kron
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
78 kron (const Sparse<Complex>&, const Sparse<Complex>&, Sparse<Complex>&); |
fe332ce262b5
eliminate spkron.cc; dispatch in kron
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
79 #endif |
fe332ce262b5
eliminate spkron.cc; dispatch in kron
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
80 |
fe332ce262b5
eliminate spkron.cc; dispatch in kron
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
81 template <class T> |
fe332ce262b5
eliminate spkron.cc; dispatch in kron
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
82 void |
fe332ce262b5
eliminate spkron.cc; dispatch in kron
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
83 kron (const Sparse<T>& A, const Sparse<T>& B, Sparse<T>& C) |
fe332ce262b5
eliminate spkron.cc; dispatch in kron
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
84 { |
fe332ce262b5
eliminate spkron.cc; dispatch in kron
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
85 octave_idx_type idx = 0; |
fe332ce262b5
eliminate spkron.cc; dispatch in kron
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
86 C = Sparse<T> (A.rows () * B.rows (), A.columns () * B.columns (), |
fe332ce262b5
eliminate spkron.cc; dispatch in kron
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
87 A.nzmax () * B.nzmax ()); |
fe332ce262b5
eliminate spkron.cc; dispatch in kron
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
88 |
fe332ce262b5
eliminate spkron.cc; dispatch in kron
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
89 C.cidx (0) = 0; |
fe332ce262b5
eliminate spkron.cc; dispatch in kron
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
90 |
fe332ce262b5
eliminate spkron.cc; dispatch in kron
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
91 for (octave_idx_type Aj = 0; Aj < A.columns (); Aj++) |
fe332ce262b5
eliminate spkron.cc; dispatch in kron
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
92 for (octave_idx_type Bj = 0; Bj < B.columns (); Bj++) |
fe332ce262b5
eliminate spkron.cc; dispatch in kron
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
93 { |
fe332ce262b5
eliminate spkron.cc; dispatch in kron
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
94 for (octave_idx_type Ai = A.cidx (Aj); Ai < A.cidx (Aj+1); Ai++) |
fe332ce262b5
eliminate spkron.cc; dispatch in kron
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
95 { |
fe332ce262b5
eliminate spkron.cc; dispatch in kron
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
96 octave_idx_type Ci = A.ridx(Ai) * B.rows (); |
fe332ce262b5
eliminate spkron.cc; dispatch in kron
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
97 const T v = A.data (Ai); |
fe332ce262b5
eliminate spkron.cc; dispatch in kron
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
98 |
fe332ce262b5
eliminate spkron.cc; dispatch in kron
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
99 for (octave_idx_type Bi = B.cidx (Bj); Bi < B.cidx (Bj+1); Bi++) |
fe332ce262b5
eliminate spkron.cc; dispatch in kron
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
100 { |
fe332ce262b5
eliminate spkron.cc; dispatch in kron
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
101 OCTAVE_QUIT; |
fe332ce262b5
eliminate spkron.cc; dispatch in kron
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
102 C.data (idx) = v * B.data (Bi); |
fe332ce262b5
eliminate spkron.cc; dispatch in kron
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
103 C.ridx (idx++) = Ci + B.ridx (Bi); |
fe332ce262b5
eliminate spkron.cc; dispatch in kron
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
104 } |
fe332ce262b5
eliminate spkron.cc; dispatch in kron
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
105 } |
fe332ce262b5
eliminate spkron.cc; dispatch in kron
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
106 C.cidx (Aj * B.columns () + Bj + 1) = idx; |
fe332ce262b5
eliminate spkron.cc; dispatch in kron
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
107 } |
fe332ce262b5
eliminate spkron.cc; dispatch in kron
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
108 } |
fe332ce262b5
eliminate spkron.cc; dispatch in kron
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
109 |
fe332ce262b5
eliminate spkron.cc; dispatch in kron
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
110 template void |
fe332ce262b5
eliminate spkron.cc; dispatch in kron
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
111 kron (const Sparse<double>&, const Sparse<double>&, Sparse<double>&); |
fe332ce262b5
eliminate spkron.cc; dispatch in kron
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
112 |
fe332ce262b5
eliminate spkron.cc; dispatch in kron
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
113 template void |
fe332ce262b5
eliminate spkron.cc; dispatch in kron
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
114 kron (const Sparse<Complex>&, const Sparse<Complex>&, Sparse<Complex>&); |
fe332ce262b5
eliminate spkron.cc; dispatch in kron
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
115 |
fe332ce262b5
eliminate spkron.cc; dispatch in kron
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
116 |
3910 | 117 DEFUN_DLD (kron, args, nargout, "-*- texinfo -*-\n\ |
6678 | 118 @deftypefn {Loadable Function} {} kron (@var{a}, @var{b})\n\ |
3910 | 119 Form the kronecker product of two matrices, defined block by block as\n\ |
120 \n\ | |
121 @example\n\ | |
122 x = [a(i, j) b]\n\ | |
123 @end example\n\ | |
124 \n\ | |
125 For example,\n\ | |
126 \n\ | |
127 @example\n\ | |
128 @group\n\ | |
129 kron (1:4, ones (3, 1))\n\ | |
130 @result{} 1 2 3 4\n\ | |
131 1 2 3 4\n\ | |
132 1 2 3 4\n\ | |
133 @end group\n\ | |
134 @end example\n\ | |
135 @end deftypefn") | |
136 { | |
137 octave_value_list retval; | |
138 | |
139 int nargin = args.length (); | |
140 | |
141 if (nargin != 2 || nargout > 1) | |
142 { | |
5823 | 143 print_usage (); |
3910 | 144 } |
7455
fe332ce262b5
eliminate spkron.cc; dispatch in kron
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
145 else if (args(0).is_sparse_type () || args(1).is_sparse_type ()) |
3910 | 146 { |
7455
fe332ce262b5
eliminate spkron.cc; dispatch in kron
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
147 if (args(0).is_complex_type () || args(1).is_complex_type ()) |
fe332ce262b5
eliminate spkron.cc; dispatch in kron
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
148 { |
fe332ce262b5
eliminate spkron.cc; dispatch in kron
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
149 SparseComplexMatrix a (args(0).sparse_complex_matrix_value()); |
fe332ce262b5
eliminate spkron.cc; dispatch in kron
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
150 SparseComplexMatrix b (args(1).sparse_complex_matrix_value()); |
3910 | 151 |
7455
fe332ce262b5
eliminate spkron.cc; dispatch in kron
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
152 if (! error_state) |
fe332ce262b5
eliminate spkron.cc; dispatch in kron
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
153 { |
fe332ce262b5
eliminate spkron.cc; dispatch in kron
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
154 SparseComplexMatrix c; |
fe332ce262b5
eliminate spkron.cc; dispatch in kron
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
155 kron (a, b, c); |
fe332ce262b5
eliminate spkron.cc; dispatch in kron
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
156 retval(0) = c; |
fe332ce262b5
eliminate spkron.cc; dispatch in kron
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
157 } |
fe332ce262b5
eliminate spkron.cc; dispatch in kron
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
158 } |
fe332ce262b5
eliminate spkron.cc; dispatch in kron
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
159 else |
3910 | 160 { |
7455
fe332ce262b5
eliminate spkron.cc; dispatch in kron
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
161 SparseMatrix a (args(0).sparse_matrix_value ()); |
fe332ce262b5
eliminate spkron.cc; dispatch in kron
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
162 SparseMatrix b (args(1).sparse_matrix_value ()); |
fe332ce262b5
eliminate spkron.cc; dispatch in kron
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
163 |
fe332ce262b5
eliminate spkron.cc; dispatch in kron
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
164 if (! error_state) |
fe332ce262b5
eliminate spkron.cc; dispatch in kron
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
165 { |
fe332ce262b5
eliminate spkron.cc; dispatch in kron
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
166 SparseMatrix c; |
fe332ce262b5
eliminate spkron.cc; dispatch in kron
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
167 kron (a, b, c); |
fe332ce262b5
eliminate spkron.cc; dispatch in kron
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
168 retval (0) = c; |
fe332ce262b5
eliminate spkron.cc; dispatch in kron
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
169 } |
3910 | 170 } |
171 } | |
7455
fe332ce262b5
eliminate spkron.cc; dispatch in kron
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
172 else |
3910 | 173 { |
7455
fe332ce262b5
eliminate spkron.cc; dispatch in kron
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
174 if (args(0).is_complex_type () || args(1).is_complex_type ()) |
fe332ce262b5
eliminate spkron.cc; dispatch in kron
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
175 { |
fe332ce262b5
eliminate spkron.cc; dispatch in kron
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
176 ComplexMatrix a (args(0).complex_matrix_value()); |
fe332ce262b5
eliminate spkron.cc; dispatch in kron
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
177 ComplexMatrix b (args(1).complex_matrix_value()); |
3910 | 178 |
7455
fe332ce262b5
eliminate spkron.cc; dispatch in kron
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
179 if (! error_state) |
fe332ce262b5
eliminate spkron.cc; dispatch in kron
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
180 { |
fe332ce262b5
eliminate spkron.cc; dispatch in kron
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
181 ComplexMatrix c; |
fe332ce262b5
eliminate spkron.cc; dispatch in kron
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
182 kron (a, b, c); |
fe332ce262b5
eliminate spkron.cc; dispatch in kron
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
183 retval(0) = c; |
fe332ce262b5
eliminate spkron.cc; dispatch in kron
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
184 } |
fe332ce262b5
eliminate spkron.cc; dispatch in kron
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
185 } |
fe332ce262b5
eliminate spkron.cc; dispatch in kron
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
186 else |
3910 | 187 { |
7455
fe332ce262b5
eliminate spkron.cc; dispatch in kron
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
188 Matrix a (args(0).matrix_value ()); |
fe332ce262b5
eliminate spkron.cc; dispatch in kron
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
189 Matrix b (args(1).matrix_value ()); |
fe332ce262b5
eliminate spkron.cc; dispatch in kron
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
190 |
fe332ce262b5
eliminate spkron.cc; dispatch in kron
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
191 if (! error_state) |
fe332ce262b5
eliminate spkron.cc; dispatch in kron
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
192 { |
fe332ce262b5
eliminate spkron.cc; dispatch in kron
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
193 Matrix c; |
fe332ce262b5
eliminate spkron.cc; dispatch in kron
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
194 kron (a, b, c); |
fe332ce262b5
eliminate spkron.cc; dispatch in kron
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
195 retval (0) = c; |
fe332ce262b5
eliminate spkron.cc; dispatch in kron
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
196 } |
3910 | 197 } |
198 } | |
199 | |
200 return retval; | |
201 } |