annotate src/DLD-FUNCTIONS/spkron.cc @ 5323:e5a68648db9c

[project @ 2005-04-29 13:10:36 by dbateman]
author dbateman
date Fri, 29 Apr 2005 13:10:36 +0000
parents
children e107161b8ca3
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
5323
e5a68648db9c [project @ 2005-04-29 13:10:36 by dbateman]
dbateman
parents:
diff changeset
1 /*
e5a68648db9c [project @ 2005-04-29 13:10:36 by dbateman]
dbateman
parents:
diff changeset
2
e5a68648db9c [project @ 2005-04-29 13:10:36 by dbateman]
dbateman
parents:
diff changeset
3 Copyright (C) 2002 John W. Eaton
e5a68648db9c [project @ 2005-04-29 13:10:36 by dbateman]
dbateman
parents:
diff changeset
4 Copyright (C) 2005 David Bateman
e5a68648db9c [project @ 2005-04-29 13:10:36 by dbateman]
dbateman
parents:
diff changeset
5
e5a68648db9c [project @ 2005-04-29 13:10:36 by dbateman]
dbateman
parents:
diff changeset
6 This file is part of Octave.
e5a68648db9c [project @ 2005-04-29 13:10:36 by dbateman]
dbateman
parents:
diff changeset
7
e5a68648db9c [project @ 2005-04-29 13:10:36 by dbateman]
dbateman
parents:
diff changeset
8 Octave is free software; you can redistribute it and/or modify it
e5a68648db9c [project @ 2005-04-29 13:10:36 by dbateman]
dbateman
parents:
diff changeset
9 under the terms of the GNU General Public License as published by the
e5a68648db9c [project @ 2005-04-29 13:10:36 by dbateman]
dbateman
parents:
diff changeset
10 Free Software Foundation; either version 2, or (at your option) any
e5a68648db9c [project @ 2005-04-29 13:10:36 by dbateman]
dbateman
parents:
diff changeset
11 later version.
e5a68648db9c [project @ 2005-04-29 13:10:36 by dbateman]
dbateman
parents:
diff changeset
12
e5a68648db9c [project @ 2005-04-29 13:10:36 by dbateman]
dbateman
parents:
diff changeset
13 Octave is distributed in the hope that it will be useful, but WITHOUT
e5a68648db9c [project @ 2005-04-29 13:10:36 by dbateman]
dbateman
parents:
diff changeset
14 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
e5a68648db9c [project @ 2005-04-29 13:10:36 by dbateman]
dbateman
parents:
diff changeset
15 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
e5a68648db9c [project @ 2005-04-29 13:10:36 by dbateman]
dbateman
parents:
diff changeset
16 for more details.
e5a68648db9c [project @ 2005-04-29 13:10:36 by dbateman]
dbateman
parents:
diff changeset
17
e5a68648db9c [project @ 2005-04-29 13:10:36 by dbateman]
dbateman
parents:
diff changeset
18 You should have received a copy of the GNU General Public License
e5a68648db9c [project @ 2005-04-29 13:10:36 by dbateman]
dbateman
parents:
diff changeset
19 along with Octave; see the file COPYING. If not, write to the Free
e5a68648db9c [project @ 2005-04-29 13:10:36 by dbateman]
dbateman
parents:
diff changeset
20 Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
e5a68648db9c [project @ 2005-04-29 13:10:36 by dbateman]
dbateman
parents:
diff changeset
21 02110-1301, USA.
e5a68648db9c [project @ 2005-04-29 13:10:36 by dbateman]
dbateman
parents:
diff changeset
22
e5a68648db9c [project @ 2005-04-29 13:10:36 by dbateman]
dbateman
parents:
diff changeset
23 */
e5a68648db9c [project @ 2005-04-29 13:10:36 by dbateman]
dbateman
parents:
diff changeset
24
e5a68648db9c [project @ 2005-04-29 13:10:36 by dbateman]
dbateman
parents:
diff changeset
25 // Author: Paul Kienzle <pkienzle@users.sf.net>
e5a68648db9c [project @ 2005-04-29 13:10:36 by dbateman]
dbateman
parents:
diff changeset
26
e5a68648db9c [project @ 2005-04-29 13:10:36 by dbateman]
dbateman
parents:
diff changeset
27 #ifdef HAVE_CONFIG_H
e5a68648db9c [project @ 2005-04-29 13:10:36 by dbateman]
dbateman
parents:
diff changeset
28 #include <config.h>
e5a68648db9c [project @ 2005-04-29 13:10:36 by dbateman]
dbateman
parents:
diff changeset
29 #endif
e5a68648db9c [project @ 2005-04-29 13:10:36 by dbateman]
dbateman
parents:
diff changeset
30
e5a68648db9c [project @ 2005-04-29 13:10:36 by dbateman]
dbateman
parents:
diff changeset
31 #include "dSparse.h"
e5a68648db9c [project @ 2005-04-29 13:10:36 by dbateman]
dbateman
parents:
diff changeset
32 #include "CSparse.h"
e5a68648db9c [project @ 2005-04-29 13:10:36 by dbateman]
dbateman
parents:
diff changeset
33 #include "quit.h"
e5a68648db9c [project @ 2005-04-29 13:10:36 by dbateman]
dbateman
parents:
diff changeset
34
e5a68648db9c [project @ 2005-04-29 13:10:36 by dbateman]
dbateman
parents:
diff changeset
35 #include "defun-dld.h"
e5a68648db9c [project @ 2005-04-29 13:10:36 by dbateman]
dbateman
parents:
diff changeset
36 #include "error.h"
e5a68648db9c [project @ 2005-04-29 13:10:36 by dbateman]
dbateman
parents:
diff changeset
37 #include "oct-obj.h"
e5a68648db9c [project @ 2005-04-29 13:10:36 by dbateman]
dbateman
parents:
diff changeset
38
e5a68648db9c [project @ 2005-04-29 13:10:36 by dbateman]
dbateman
parents:
diff changeset
39 #if !defined (CXX_NEW_FRIEND_TEMPLATE_DECL)
e5a68648db9c [project @ 2005-04-29 13:10:36 by dbateman]
dbateman
parents:
diff changeset
40 extern void
e5a68648db9c [project @ 2005-04-29 13:10:36 by dbateman]
dbateman
parents:
diff changeset
41 kron (const Sparse<double>&, const Sparse<double>&, Sparse<double>&);
e5a68648db9c [project @ 2005-04-29 13:10:36 by dbateman]
dbateman
parents:
diff changeset
42
e5a68648db9c [project @ 2005-04-29 13:10:36 by dbateman]
dbateman
parents:
diff changeset
43 extern void
e5a68648db9c [project @ 2005-04-29 13:10:36 by dbateman]
dbateman
parents:
diff changeset
44 kron (const Sparse<Complex>&, const Sparse<Complex>&, Sparse<Complex>&);
e5a68648db9c [project @ 2005-04-29 13:10:36 by dbateman]
dbateman
parents:
diff changeset
45 #endif
e5a68648db9c [project @ 2005-04-29 13:10:36 by dbateman]
dbateman
parents:
diff changeset
46
e5a68648db9c [project @ 2005-04-29 13:10:36 by dbateman]
dbateman
parents:
diff changeset
47 template <class T>
e5a68648db9c [project @ 2005-04-29 13:10:36 by dbateman]
dbateman
parents:
diff changeset
48 void
e5a68648db9c [project @ 2005-04-29 13:10:36 by dbateman]
dbateman
parents:
diff changeset
49 kron (const Sparse<T>& A, const Sparse<T>& B, Sparse<T>& C)
e5a68648db9c [project @ 2005-04-29 13:10:36 by dbateman]
dbateman
parents:
diff changeset
50 {
e5a68648db9c [project @ 2005-04-29 13:10:36 by dbateman]
dbateman
parents:
diff changeset
51 octave_idx_type idx = 0;
e5a68648db9c [project @ 2005-04-29 13:10:36 by dbateman]
dbateman
parents:
diff changeset
52 C = Sparse<T> (A.rows () * B.rows (), A.columns () * B.columns (),
e5a68648db9c [project @ 2005-04-29 13:10:36 by dbateman]
dbateman
parents:
diff changeset
53 A.nnz () * B.nnz ());
e5a68648db9c [project @ 2005-04-29 13:10:36 by dbateman]
dbateman
parents:
diff changeset
54
e5a68648db9c [project @ 2005-04-29 13:10:36 by dbateman]
dbateman
parents:
diff changeset
55 C.cidx (0) = 0;
e5a68648db9c [project @ 2005-04-29 13:10:36 by dbateman]
dbateman
parents:
diff changeset
56
e5a68648db9c [project @ 2005-04-29 13:10:36 by dbateman]
dbateman
parents:
diff changeset
57 for (octave_idx_type Aj = 0; Aj < A.columns (); Aj++)
e5a68648db9c [project @ 2005-04-29 13:10:36 by dbateman]
dbateman
parents:
diff changeset
58 for (octave_idx_type Bj = 0; Bj < B.columns (); Bj++)
e5a68648db9c [project @ 2005-04-29 13:10:36 by dbateman]
dbateman
parents:
diff changeset
59 {
e5a68648db9c [project @ 2005-04-29 13:10:36 by dbateman]
dbateman
parents:
diff changeset
60 for (octave_idx_type Ai = A.cidx (Aj); Ai < A.cidx (Aj+1); Ai++)
e5a68648db9c [project @ 2005-04-29 13:10:36 by dbateman]
dbateman
parents:
diff changeset
61 {
e5a68648db9c [project @ 2005-04-29 13:10:36 by dbateman]
dbateman
parents:
diff changeset
62 octave_idx_type Ci = A.ridx(Ai) * B.rows ();
e5a68648db9c [project @ 2005-04-29 13:10:36 by dbateman]
dbateman
parents:
diff changeset
63 const T v = A.data (Ai);
e5a68648db9c [project @ 2005-04-29 13:10:36 by dbateman]
dbateman
parents:
diff changeset
64
e5a68648db9c [project @ 2005-04-29 13:10:36 by dbateman]
dbateman
parents:
diff changeset
65 for (octave_idx_type Bi = B.cidx (Bj); Bi < B.cidx (Bj+1); Bi++)
e5a68648db9c [project @ 2005-04-29 13:10:36 by dbateman]
dbateman
parents:
diff changeset
66 {
e5a68648db9c [project @ 2005-04-29 13:10:36 by dbateman]
dbateman
parents:
diff changeset
67 OCTAVE_QUIT;
e5a68648db9c [project @ 2005-04-29 13:10:36 by dbateman]
dbateman
parents:
diff changeset
68 C.data (idx) = v * B.data (Bi);
e5a68648db9c [project @ 2005-04-29 13:10:36 by dbateman]
dbateman
parents:
diff changeset
69 C.ridx (idx++) = Ci + B.ridx (Bi);
e5a68648db9c [project @ 2005-04-29 13:10:36 by dbateman]
dbateman
parents:
diff changeset
70 }
e5a68648db9c [project @ 2005-04-29 13:10:36 by dbateman]
dbateman
parents:
diff changeset
71 }
e5a68648db9c [project @ 2005-04-29 13:10:36 by dbateman]
dbateman
parents:
diff changeset
72 C.cidx (Aj * B.columns () + Bj + 1) = idx;
e5a68648db9c [project @ 2005-04-29 13:10:36 by dbateman]
dbateman
parents:
diff changeset
73 }
e5a68648db9c [project @ 2005-04-29 13:10:36 by dbateman]
dbateman
parents:
diff changeset
74 }
e5a68648db9c [project @ 2005-04-29 13:10:36 by dbateman]
dbateman
parents:
diff changeset
75
e5a68648db9c [project @ 2005-04-29 13:10:36 by dbateman]
dbateman
parents:
diff changeset
76 template void
e5a68648db9c [project @ 2005-04-29 13:10:36 by dbateman]
dbateman
parents:
diff changeset
77 kron (const Sparse<double>&, const Sparse<double>&, Sparse<double>&);
e5a68648db9c [project @ 2005-04-29 13:10:36 by dbateman]
dbateman
parents:
diff changeset
78
e5a68648db9c [project @ 2005-04-29 13:10:36 by dbateman]
dbateman
parents:
diff changeset
79 template void
e5a68648db9c [project @ 2005-04-29 13:10:36 by dbateman]
dbateman
parents:
diff changeset
80 kron (const Sparse<Complex>&, const Sparse<Complex>&, Sparse<Complex>&);
e5a68648db9c [project @ 2005-04-29 13:10:36 by dbateman]
dbateman
parents:
diff changeset
81
e5a68648db9c [project @ 2005-04-29 13:10:36 by dbateman]
dbateman
parents:
diff changeset
82 // PKG_ADD: dispatch ("kron", "spkron", "sparse matrix")
e5a68648db9c [project @ 2005-04-29 13:10:36 by dbateman]
dbateman
parents:
diff changeset
83 // PKG_ADD: dispatch ("kron", "spkron", "sparse complex matrix")
e5a68648db9c [project @ 2005-04-29 13:10:36 by dbateman]
dbateman
parents:
diff changeset
84 // PKG_ADD: dispatch ("kron", "spkron", "sparse bool matrix")
e5a68648db9c [project @ 2005-04-29 13:10:36 by dbateman]
dbateman
parents:
diff changeset
85 DEFUN_DLD (spkron, args, nargout, "-*- texinfo -*-\n\
e5a68648db9c [project @ 2005-04-29 13:10:36 by dbateman]
dbateman
parents:
diff changeset
86 @deftypefn {Function File} {} spkron (@var{a}, @var{b})\n\
e5a68648db9c [project @ 2005-04-29 13:10:36 by dbateman]
dbateman
parents:
diff changeset
87 Form the kronecker product of two sparse matrices. This is defined\n\
e5a68648db9c [project @ 2005-04-29 13:10:36 by dbateman]
dbateman
parents:
diff changeset
88 block by block as\n\
e5a68648db9c [project @ 2005-04-29 13:10:36 by dbateman]
dbateman
parents:
diff changeset
89 \n\
e5a68648db9c [project @ 2005-04-29 13:10:36 by dbateman]
dbateman
parents:
diff changeset
90 @example\n\
e5a68648db9c [project @ 2005-04-29 13:10:36 by dbateman]
dbateman
parents:
diff changeset
91 x = [a(i, j) b]\n\
e5a68648db9c [project @ 2005-04-29 13:10:36 by dbateman]
dbateman
parents:
diff changeset
92 @end example\n\
e5a68648db9c [project @ 2005-04-29 13:10:36 by dbateman]
dbateman
parents:
diff changeset
93 \n\
e5a68648db9c [project @ 2005-04-29 13:10:36 by dbateman]
dbateman
parents:
diff changeset
94 For example,\n\
e5a68648db9c [project @ 2005-04-29 13:10:36 by dbateman]
dbateman
parents:
diff changeset
95 \n\
e5a68648db9c [project @ 2005-04-29 13:10:36 by dbateman]
dbateman
parents:
diff changeset
96 @example\n\
e5a68648db9c [project @ 2005-04-29 13:10:36 by dbateman]
dbateman
parents:
diff changeset
97 @group\n\
e5a68648db9c [project @ 2005-04-29 13:10:36 by dbateman]
dbateman
parents:
diff changeset
98 kron (1:4, ones (3, 1))\n\
e5a68648db9c [project @ 2005-04-29 13:10:36 by dbateman]
dbateman
parents:
diff changeset
99 @result{} 1 2 3 4\n\
e5a68648db9c [project @ 2005-04-29 13:10:36 by dbateman]
dbateman
parents:
diff changeset
100 1 2 3 4\n\
e5a68648db9c [project @ 2005-04-29 13:10:36 by dbateman]
dbateman
parents:
diff changeset
101 1 2 3 4\n\
e5a68648db9c [project @ 2005-04-29 13:10:36 by dbateman]
dbateman
parents:
diff changeset
102 @end group\n\
e5a68648db9c [project @ 2005-04-29 13:10:36 by dbateman]
dbateman
parents:
diff changeset
103 @end example\n\
e5a68648db9c [project @ 2005-04-29 13:10:36 by dbateman]
dbateman
parents:
diff changeset
104 @end deftypefn")
e5a68648db9c [project @ 2005-04-29 13:10:36 by dbateman]
dbateman
parents:
diff changeset
105 {
e5a68648db9c [project @ 2005-04-29 13:10:36 by dbateman]
dbateman
parents:
diff changeset
106 octave_value_list retval;
e5a68648db9c [project @ 2005-04-29 13:10:36 by dbateman]
dbateman
parents:
diff changeset
107
e5a68648db9c [project @ 2005-04-29 13:10:36 by dbateman]
dbateman
parents:
diff changeset
108 int nargin = args.length ();
e5a68648db9c [project @ 2005-04-29 13:10:36 by dbateman]
dbateman
parents:
diff changeset
109
e5a68648db9c [project @ 2005-04-29 13:10:36 by dbateman]
dbateman
parents:
diff changeset
110 if (nargin != 2 || nargout > 1)
e5a68648db9c [project @ 2005-04-29 13:10:36 by dbateman]
dbateman
parents:
diff changeset
111 {
e5a68648db9c [project @ 2005-04-29 13:10:36 by dbateman]
dbateman
parents:
diff changeset
112 print_usage ("kron");
e5a68648db9c [project @ 2005-04-29 13:10:36 by dbateman]
dbateman
parents:
diff changeset
113 }
e5a68648db9c [project @ 2005-04-29 13:10:36 by dbateman]
dbateman
parents:
diff changeset
114 else if (args(0).is_complex_type () || args(1).is_complex_type ())
e5a68648db9c [project @ 2005-04-29 13:10:36 by dbateman]
dbateman
parents:
diff changeset
115 {
e5a68648db9c [project @ 2005-04-29 13:10:36 by dbateman]
dbateman
parents:
diff changeset
116 SparseComplexMatrix a (args(0).sparse_complex_matrix_value());
e5a68648db9c [project @ 2005-04-29 13:10:36 by dbateman]
dbateman
parents:
diff changeset
117 SparseComplexMatrix b (args(1).sparse_complex_matrix_value());
e5a68648db9c [project @ 2005-04-29 13:10:36 by dbateman]
dbateman
parents:
diff changeset
118
e5a68648db9c [project @ 2005-04-29 13:10:36 by dbateman]
dbateman
parents:
diff changeset
119 if (! error_state)
e5a68648db9c [project @ 2005-04-29 13:10:36 by dbateman]
dbateman
parents:
diff changeset
120 {
e5a68648db9c [project @ 2005-04-29 13:10:36 by dbateman]
dbateman
parents:
diff changeset
121 SparseComplexMatrix c;
e5a68648db9c [project @ 2005-04-29 13:10:36 by dbateman]
dbateman
parents:
diff changeset
122 kron (a, b, c);
e5a68648db9c [project @ 2005-04-29 13:10:36 by dbateman]
dbateman
parents:
diff changeset
123 retval(0) = c;
e5a68648db9c [project @ 2005-04-29 13:10:36 by dbateman]
dbateman
parents:
diff changeset
124 }
e5a68648db9c [project @ 2005-04-29 13:10:36 by dbateman]
dbateman
parents:
diff changeset
125 }
e5a68648db9c [project @ 2005-04-29 13:10:36 by dbateman]
dbateman
parents:
diff changeset
126 else
e5a68648db9c [project @ 2005-04-29 13:10:36 by dbateman]
dbateman
parents:
diff changeset
127 {
e5a68648db9c [project @ 2005-04-29 13:10:36 by dbateman]
dbateman
parents:
diff changeset
128 SparseMatrix a (args(0).sparse_matrix_value ());
e5a68648db9c [project @ 2005-04-29 13:10:36 by dbateman]
dbateman
parents:
diff changeset
129 SparseMatrix b (args(1).sparse_matrix_value ());
e5a68648db9c [project @ 2005-04-29 13:10:36 by dbateman]
dbateman
parents:
diff changeset
130
e5a68648db9c [project @ 2005-04-29 13:10:36 by dbateman]
dbateman
parents:
diff changeset
131 if (! error_state)
e5a68648db9c [project @ 2005-04-29 13:10:36 by dbateman]
dbateman
parents:
diff changeset
132 {
e5a68648db9c [project @ 2005-04-29 13:10:36 by dbateman]
dbateman
parents:
diff changeset
133 SparseMatrix c;
e5a68648db9c [project @ 2005-04-29 13:10:36 by dbateman]
dbateman
parents:
diff changeset
134 kron (a, b, c);
e5a68648db9c [project @ 2005-04-29 13:10:36 by dbateman]
dbateman
parents:
diff changeset
135 retval (0) = c;
e5a68648db9c [project @ 2005-04-29 13:10:36 by dbateman]
dbateman
parents:
diff changeset
136 }
e5a68648db9c [project @ 2005-04-29 13:10:36 by dbateman]
dbateman
parents:
diff changeset
137 }
e5a68648db9c [project @ 2005-04-29 13:10:36 by dbateman]
dbateman
parents:
diff changeset
138
e5a68648db9c [project @ 2005-04-29 13:10:36 by dbateman]
dbateman
parents:
diff changeset
139 return retval;
e5a68648db9c [project @ 2005-04-29 13:10:36 by dbateman]
dbateman
parents:
diff changeset
140 }