annotate libinterp/corefcn/kron.cc @ 15942:75cea615ade4

Check for sparse before diagonal class in kron (bug #38082) * kron.cc (Fkron): Move the check for sparseness to before for diagonal matrices.
author Jordi Gutiérrez Hermoso <jordigh@octave.org>
date Mon, 14 Jan 2013 13:35:09 -0500
parents 2fc554ffbc28
children d63878346099
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
3910
79a90a0f0eff [project @ 2002-04-25 05:36:52 by jwe]
jwe
parents:
diff changeset
1 /*
79a90a0f0eff [project @ 2002-04-25 05:36:52 by jwe]
jwe
parents:
diff changeset
2
14138
72c96de7a403 maint: update copyright notices for 2012
John W. Eaton <jwe@octave.org>
parents: 13929
diff changeset
3 Copyright (C) 2002-2012 John W. Eaton
3910
79a90a0f0eff [project @ 2002-04-25 05:36:52 by jwe]
jwe
parents:
diff changeset
4
79a90a0f0eff [project @ 2002-04-25 05:36:52 by jwe]
jwe
parents:
diff changeset
5 This file is part of Octave.
79a90a0f0eff [project @ 2002-04-25 05:36:52 by jwe]
jwe
parents:
diff changeset
6
79a90a0f0eff [project @ 2002-04-25 05:36:52 by jwe]
jwe
parents:
diff changeset
7 Octave is free software; you can redistribute it and/or modify it
79a90a0f0eff [project @ 2002-04-25 05:36:52 by jwe]
jwe
parents:
diff changeset
8 under the terms of the GNU General Public License as published by the
7016
93c65f2a5668 [project @ 2007-10-12 06:40:56 by jwe]
jwe
parents: 6678
diff changeset
9 Free Software Foundation; either version 3 of the License, or (at your
93c65f2a5668 [project @ 2007-10-12 06:40:56 by jwe]
jwe
parents: 6678
diff changeset
10 option) any later version.
3910
79a90a0f0eff [project @ 2002-04-25 05:36:52 by jwe]
jwe
parents:
diff changeset
11
79a90a0f0eff [project @ 2002-04-25 05:36:52 by jwe]
jwe
parents:
diff changeset
12 Octave is distributed in the hope that it will be useful, but WITHOUT
79a90a0f0eff [project @ 2002-04-25 05:36:52 by jwe]
jwe
parents:
diff changeset
13 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
79a90a0f0eff [project @ 2002-04-25 05:36:52 by jwe]
jwe
parents:
diff changeset
14 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
79a90a0f0eff [project @ 2002-04-25 05:36:52 by jwe]
jwe
parents:
diff changeset
15 for more details.
79a90a0f0eff [project @ 2002-04-25 05:36:52 by jwe]
jwe
parents:
diff changeset
16
79a90a0f0eff [project @ 2002-04-25 05:36:52 by jwe]
jwe
parents:
diff changeset
17 You should have received a copy of the GNU General Public License
7016
93c65f2a5668 [project @ 2007-10-12 06:40:56 by jwe]
jwe
parents: 6678
diff changeset
18 along with Octave; see the file COPYING. If not, see
93c65f2a5668 [project @ 2007-10-12 06:40:56 by jwe]
jwe
parents: 6678
diff changeset
19 <http://www.gnu.org/licenses/>.
3910
79a90a0f0eff [project @ 2002-04-25 05:36:52 by jwe]
jwe
parents:
diff changeset
20
79a90a0f0eff [project @ 2002-04-25 05:36:52 by jwe]
jwe
parents:
diff changeset
21 */
79a90a0f0eff [project @ 2002-04-25 05:36:52 by jwe]
jwe
parents:
diff changeset
22
3911
8389e78e67d4 [project @ 2002-04-28 02:15:38 by jwe]
jwe
parents: 3910
diff changeset
23 // Author: Paul Kienzle <pkienzle@users.sf.net>
8389e78e67d4 [project @ 2002-04-28 02:15:38 by jwe]
jwe
parents: 3910
diff changeset
24
3910
79a90a0f0eff [project @ 2002-04-25 05:36:52 by jwe]
jwe
parents:
diff changeset
25 #ifdef HAVE_CONFIG_H
79a90a0f0eff [project @ 2002-04-25 05:36:52 by jwe]
jwe
parents:
diff changeset
26 #include <config.h>
79a90a0f0eff [project @ 2002-04-25 05:36:52 by jwe]
jwe
parents:
diff changeset
27 #endif
79a90a0f0eff [project @ 2002-04-25 05:36:52 by jwe]
jwe
parents:
diff changeset
28
79a90a0f0eff [project @ 2002-04-25 05:36:52 by jwe]
jwe
parents:
diff changeset
29 #include "dMatrix.h"
10461
81067c72361f optimize kron
Jaroslav Hajek <highegg@gmail.com>
parents: 10350
diff changeset
30 #include "fMatrix.h"
3910
79a90a0f0eff [project @ 2002-04-25 05:36:52 by jwe]
jwe
parents:
diff changeset
31 #include "CMatrix.h"
10461
81067c72361f optimize kron
Jaroslav Hajek <highegg@gmail.com>
parents: 10350
diff changeset
32 #include "fCMatrix.h"
81067c72361f optimize kron
Jaroslav Hajek <highegg@gmail.com>
parents: 10350
diff changeset
33
81067c72361f optimize kron
Jaroslav Hajek <highegg@gmail.com>
parents: 10350
diff changeset
34 #include "dSparse.h"
81067c72361f optimize kron
Jaroslav Hajek <highegg@gmail.com>
parents: 10350
diff changeset
35 #include "CSparse.h"
81067c72361f optimize kron
Jaroslav Hajek <highegg@gmail.com>
parents: 10350
diff changeset
36
81067c72361f optimize kron
Jaroslav Hajek <highegg@gmail.com>
parents: 10350
diff changeset
37 #include "dDiagMatrix.h"
81067c72361f optimize kron
Jaroslav Hajek <highegg@gmail.com>
parents: 10350
diff changeset
38 #include "fDiagMatrix.h"
81067c72361f optimize kron
Jaroslav Hajek <highegg@gmail.com>
parents: 10350
diff changeset
39 #include "CDiagMatrix.h"
81067c72361f optimize kron
Jaroslav Hajek <highegg@gmail.com>
parents: 10350
diff changeset
40 #include "fCDiagMatrix.h"
81067c72361f optimize kron
Jaroslav Hajek <highegg@gmail.com>
parents: 10350
diff changeset
41
81067c72361f optimize kron
Jaroslav Hajek <highegg@gmail.com>
parents: 10350
diff changeset
42 #include "PermMatrix.h"
81067c72361f optimize kron
Jaroslav Hajek <highegg@gmail.com>
parents: 10350
diff changeset
43
81067c72361f optimize kron
Jaroslav Hajek <highegg@gmail.com>
parents: 10350
diff changeset
44 #include "mx-inlines.cc"
4153
6b96ce9f5743 [project @ 2002-11-06 20:38:49 by jwe]
jwe
parents: 3911
diff changeset
45 #include "quit.h"
3910
79a90a0f0eff [project @ 2002-04-25 05:36:52 by jwe]
jwe
parents:
diff changeset
46
15039
e753177cde93 maint: Move non-dynamically linked functions from DLD-FUNCTIONS/ to corefcn/ directory
Rik <rik@octave.org>
parents: 14854
diff changeset
47 #include "defun.h"
3910
79a90a0f0eff [project @ 2002-04-25 05:36:52 by jwe]
jwe
parents:
diff changeset
48 #include "error.h"
79a90a0f0eff [project @ 2002-04-25 05:36:52 by jwe]
jwe
parents:
diff changeset
49 #include "oct-obj.h"
79a90a0f0eff [project @ 2002-04-25 05:36:52 by jwe]
jwe
parents:
diff changeset
50
10461
81067c72361f optimize kron
Jaroslav Hajek <highegg@gmail.com>
parents: 10350
diff changeset
51 template <class R, class T>
81067c72361f optimize kron
Jaroslav Hajek <highegg@gmail.com>
parents: 10350
diff changeset
52 static MArray<T>
81067c72361f optimize kron
Jaroslav Hajek <highegg@gmail.com>
parents: 10350
diff changeset
53 kron (const MArray<R>& a, const MArray<T>& b)
81067c72361f optimize kron
Jaroslav Hajek <highegg@gmail.com>
parents: 10350
diff changeset
54 {
81067c72361f optimize kron
Jaroslav Hajek <highegg@gmail.com>
parents: 10350
diff changeset
55 assert (a.ndims () == 2);
81067c72361f optimize kron
Jaroslav Hajek <highegg@gmail.com>
parents: 10350
diff changeset
56 assert (b.ndims () == 2);
81067c72361f optimize kron
Jaroslav Hajek <highegg@gmail.com>
parents: 10350
diff changeset
57
81067c72361f optimize kron
Jaroslav Hajek <highegg@gmail.com>
parents: 10350
diff changeset
58 octave_idx_type nra = a.rows (), nrb = b.rows ();
81067c72361f optimize kron
Jaroslav Hajek <highegg@gmail.com>
parents: 10350
diff changeset
59 octave_idx_type nca = a.cols (), ncb = b.cols ();
3910
79a90a0f0eff [project @ 2002-04-25 05:36:52 by jwe]
jwe
parents:
diff changeset
60
11570
57632dea2446 attempt better backward compatibility for Array constructors
John W. Eaton <jwe@octave.org>
parents: 11553
diff changeset
61 MArray<T> c (dim_vector (nra*nrb, nca*ncb));
10461
81067c72361f optimize kron
Jaroslav Hajek <highegg@gmail.com>
parents: 10350
diff changeset
62 T *cv = c.fortran_vec ();
81067c72361f optimize kron
Jaroslav Hajek <highegg@gmail.com>
parents: 10350
diff changeset
63
81067c72361f optimize kron
Jaroslav Hajek <highegg@gmail.com>
parents: 10350
diff changeset
64 for (octave_idx_type ja = 0; ja < nca; ja++)
81067c72361f optimize kron
Jaroslav Hajek <highegg@gmail.com>
parents: 10350
diff changeset
65 for (octave_idx_type jb = 0; jb < ncb; jb++)
81067c72361f optimize kron
Jaroslav Hajek <highegg@gmail.com>
parents: 10350
diff changeset
66 for (octave_idx_type ia = 0; ia < nra; ia++)
81067c72361f optimize kron
Jaroslav Hajek <highegg@gmail.com>
parents: 10350
diff changeset
67 {
81067c72361f optimize kron
Jaroslav Hajek <highegg@gmail.com>
parents: 10350
diff changeset
68 octave_quit ();
81067c72361f optimize kron
Jaroslav Hajek <highegg@gmail.com>
parents: 10350
diff changeset
69 mx_inline_mul (nrb, cv, a(ia, ja), b.data () + nrb*jb);
81067c72361f optimize kron
Jaroslav Hajek <highegg@gmail.com>
parents: 10350
diff changeset
70 cv += nrb;
81067c72361f optimize kron
Jaroslav Hajek <highegg@gmail.com>
parents: 10350
diff changeset
71 }
7789
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7455
diff changeset
72
10461
81067c72361f optimize kron
Jaroslav Hajek <highegg@gmail.com>
parents: 10350
diff changeset
73 return c;
81067c72361f optimize kron
Jaroslav Hajek <highegg@gmail.com>
parents: 10350
diff changeset
74 }
81067c72361f optimize kron
Jaroslav Hajek <highegg@gmail.com>
parents: 10350
diff changeset
75
81067c72361f optimize kron
Jaroslav Hajek <highegg@gmail.com>
parents: 10350
diff changeset
76 template <class R, class T>
81067c72361f optimize kron
Jaroslav Hajek <highegg@gmail.com>
parents: 10350
diff changeset
77 static MArray<T>
81067c72361f optimize kron
Jaroslav Hajek <highegg@gmail.com>
parents: 10350
diff changeset
78 kron (const MDiagArray2<R>& a, const MArray<T>& b)
81067c72361f optimize kron
Jaroslav Hajek <highegg@gmail.com>
parents: 10350
diff changeset
79 {
81067c72361f optimize kron
Jaroslav Hajek <highegg@gmail.com>
parents: 10350
diff changeset
80 assert (b.ndims () == 2);
81067c72361f optimize kron
Jaroslav Hajek <highegg@gmail.com>
parents: 10350
diff changeset
81
81067c72361f optimize kron
Jaroslav Hajek <highegg@gmail.com>
parents: 10350
diff changeset
82 octave_idx_type nra = a.rows (), nrb = b.rows (), dla = a.diag_length ();
81067c72361f optimize kron
Jaroslav Hajek <highegg@gmail.com>
parents: 10350
diff changeset
83 octave_idx_type nca = a.cols (), ncb = b.cols ();
7789
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7455
diff changeset
84
14846
460a3c6d8bf1 maint: Use Octave coding convention for cuddled parenthis in function calls with empty argument lists.
Rik <octave@nomad.inbox5.com>
parents: 14556
diff changeset
85 MArray<T> c (dim_vector (nra*nrb, nca*ncb), T ());
10461
81067c72361f optimize kron
Jaroslav Hajek <highegg@gmail.com>
parents: 10350
diff changeset
86
81067c72361f optimize kron
Jaroslav Hajek <highegg@gmail.com>
parents: 10350
diff changeset
87 for (octave_idx_type ja = 0; ja < dla; ja++)
81067c72361f optimize kron
Jaroslav Hajek <highegg@gmail.com>
parents: 10350
diff changeset
88 for (octave_idx_type jb = 0; jb < ncb; jb++)
81067c72361f optimize kron
Jaroslav Hajek <highegg@gmail.com>
parents: 10350
diff changeset
89 {
81067c72361f optimize kron
Jaroslav Hajek <highegg@gmail.com>
parents: 10350
diff changeset
90 octave_quit ();
14854
5ae9f0f77635 maint: Use Octave coding conventions for coddling parenthis is DLD-FUNCTIONS directory
Rik <octave@nomad.inbox5.com>
parents: 14846
diff changeset
91 mx_inline_mul (nrb, &c.xelem (ja*nrb, ja*ncb + jb), a.dgelem (ja), b.data () + nrb*jb);
10461
81067c72361f optimize kron
Jaroslav Hajek <highegg@gmail.com>
parents: 10350
diff changeset
92 }
81067c72361f optimize kron
Jaroslav Hajek <highegg@gmail.com>
parents: 10350
diff changeset
93
81067c72361f optimize kron
Jaroslav Hajek <highegg@gmail.com>
parents: 10350
diff changeset
94 return c;
81067c72361f optimize kron
Jaroslav Hajek <highegg@gmail.com>
parents: 10350
diff changeset
95 }
3910
79a90a0f0eff [project @ 2002-04-25 05:36:52 by jwe]
jwe
parents:
diff changeset
96
79a90a0f0eff [project @ 2002-04-25 05:36:52 by jwe]
jwe
parents:
diff changeset
97 template <class T>
10461
81067c72361f optimize kron
Jaroslav Hajek <highegg@gmail.com>
parents: 10350
diff changeset
98 static MSparse<T>
81067c72361f optimize kron
Jaroslav Hajek <highegg@gmail.com>
parents: 10350
diff changeset
99 kron (const MSparse<T>& A, const MSparse<T>& B)
7455
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_idx_type idx = 0;
11586
12df7854fa7c strip trailing whitespace from source files
John W. Eaton <jwe@octave.org>
parents: 11570
diff changeset
102 MSparse<T> C (A.rows () * B.rows (), A.columns () * B.columns (),
10527
b4d2080b6df7 Replace nzmax by nnz as needed
David Bateman <dbateman@free.fr>
parents: 10461
diff changeset
103 A.nnz () * B.nnz ());
7455
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 C.cidx (0) = 0;
fe332ce262b5 eliminate spkron.cc; dispatch in kron
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
106
fe332ce262b5 eliminate spkron.cc; dispatch in kron
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
107 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
108 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
109 {
10461
81067c72361f optimize kron
Jaroslav Hajek <highegg@gmail.com>
parents: 10350
diff changeset
110 octave_quit ();
10154
40dfc0c99116 DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents: 9209
diff changeset
111 for (octave_idx_type Ai = A.cidx (Aj); Ai < A.cidx (Aj+1); Ai++)
40dfc0c99116 DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents: 9209
diff changeset
112 {
14854
5ae9f0f77635 maint: Use Octave coding conventions for coddling parenthis is DLD-FUNCTIONS directory
Rik <octave@nomad.inbox5.com>
parents: 14846
diff changeset
113 octave_idx_type Ci = A.ridx (Ai) * B.rows ();
10154
40dfc0c99116 DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents: 9209
diff changeset
114 const T v = A.data (Ai);
7455
fe332ce262b5 eliminate spkron.cc; dispatch in kron
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
115
10154
40dfc0c99116 DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents: 9209
diff changeset
116 for (octave_idx_type Bi = B.cidx (Bj); Bi < B.cidx (Bj+1); Bi++)
40dfc0c99116 DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents: 9209
diff changeset
117 {
40dfc0c99116 DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents: 9209
diff changeset
118 C.data (idx) = v * B.data (Bi);
40dfc0c99116 DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents: 9209
diff changeset
119 C.ridx (idx++) = Ci + B.ridx (Bi);
40dfc0c99116 DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents: 9209
diff changeset
120 }
40dfc0c99116 DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents: 9209
diff changeset
121 }
40dfc0c99116 DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents: 9209
diff changeset
122 C.cidx (Aj * B.columns () + Bj + 1) = idx;
7455
fe332ce262b5 eliminate spkron.cc; dispatch in kron
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
123 }
10461
81067c72361f optimize kron
Jaroslav Hajek <highegg@gmail.com>
parents: 10350
diff changeset
124
81067c72361f optimize kron
Jaroslav Hajek <highegg@gmail.com>
parents: 10350
diff changeset
125 return C;
7455
fe332ce262b5 eliminate spkron.cc; dispatch in kron
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
126 }
fe332ce262b5 eliminate spkron.cc; dispatch in kron
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
127
10461
81067c72361f optimize kron
Jaroslav Hajek <highegg@gmail.com>
parents: 10350
diff changeset
128 static PermMatrix
81067c72361f optimize kron
Jaroslav Hajek <highegg@gmail.com>
parents: 10350
diff changeset
129 kron (const PermMatrix& a, const PermMatrix& b)
81067c72361f optimize kron
Jaroslav Hajek <highegg@gmail.com>
parents: 10350
diff changeset
130 {
81067c72361f optimize kron
Jaroslav Hajek <highegg@gmail.com>
parents: 10350
diff changeset
131 octave_idx_type na = a.rows (), nb = b.rows ();
81067c72361f optimize kron
Jaroslav Hajek <highegg@gmail.com>
parents: 10350
diff changeset
132 const octave_idx_type *pa = a.data (), *pb = b.data ();
81067c72361f optimize kron
Jaroslav Hajek <highegg@gmail.com>
parents: 10350
diff changeset
133 PermMatrix c(na*nb); // Row permutation.
81067c72361f optimize kron
Jaroslav Hajek <highegg@gmail.com>
parents: 10350
diff changeset
134 octave_idx_type *pc = c.fortran_vec ();
7455
fe332ce262b5 eliminate spkron.cc; dispatch in kron
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
135
10461
81067c72361f optimize kron
Jaroslav Hajek <highegg@gmail.com>
parents: 10350
diff changeset
136 bool cola = a.is_col_perm (), colb = b.is_col_perm ();
81067c72361f optimize kron
Jaroslav Hajek <highegg@gmail.com>
parents: 10350
diff changeset
137 if (cola && colb)
81067c72361f optimize kron
Jaroslav Hajek <highegg@gmail.com>
parents: 10350
diff changeset
138 {
81067c72361f optimize kron
Jaroslav Hajek <highegg@gmail.com>
parents: 10350
diff changeset
139 for (octave_idx_type i = 0; i < na; i++)
81067c72361f optimize kron
Jaroslav Hajek <highegg@gmail.com>
parents: 10350
diff changeset
140 for (octave_idx_type j = 0; j < nb; j++)
81067c72361f optimize kron
Jaroslav Hajek <highegg@gmail.com>
parents: 10350
diff changeset
141 pc[pa[i]*nb+pb[j]] = i*nb+j;
81067c72361f optimize kron
Jaroslav Hajek <highegg@gmail.com>
parents: 10350
diff changeset
142 }
81067c72361f optimize kron
Jaroslav Hajek <highegg@gmail.com>
parents: 10350
diff changeset
143 else if (cola)
81067c72361f optimize kron
Jaroslav Hajek <highegg@gmail.com>
parents: 10350
diff changeset
144 {
81067c72361f optimize kron
Jaroslav Hajek <highegg@gmail.com>
parents: 10350
diff changeset
145 for (octave_idx_type i = 0; i < na; i++)
81067c72361f optimize kron
Jaroslav Hajek <highegg@gmail.com>
parents: 10350
diff changeset
146 for (octave_idx_type j = 0; j < nb; j++)
81067c72361f optimize kron
Jaroslav Hajek <highegg@gmail.com>
parents: 10350
diff changeset
147 pc[pa[i]*nb+j] = i*nb+pb[j];
81067c72361f optimize kron
Jaroslav Hajek <highegg@gmail.com>
parents: 10350
diff changeset
148 }
81067c72361f optimize kron
Jaroslav Hajek <highegg@gmail.com>
parents: 10350
diff changeset
149 else if (colb)
81067c72361f optimize kron
Jaroslav Hajek <highegg@gmail.com>
parents: 10350
diff changeset
150 {
81067c72361f optimize kron
Jaroslav Hajek <highegg@gmail.com>
parents: 10350
diff changeset
151 for (octave_idx_type i = 0; i < na; i++)
81067c72361f optimize kron
Jaroslav Hajek <highegg@gmail.com>
parents: 10350
diff changeset
152 for (octave_idx_type j = 0; j < nb; j++)
81067c72361f optimize kron
Jaroslav Hajek <highegg@gmail.com>
parents: 10350
diff changeset
153 pc[i*nb+pb[j]] = pa[i]*nb+j;
81067c72361f optimize kron
Jaroslav Hajek <highegg@gmail.com>
parents: 10350
diff changeset
154 }
81067c72361f optimize kron
Jaroslav Hajek <highegg@gmail.com>
parents: 10350
diff changeset
155 else
81067c72361f optimize kron
Jaroslav Hajek <highegg@gmail.com>
parents: 10350
diff changeset
156 {
81067c72361f optimize kron
Jaroslav Hajek <highegg@gmail.com>
parents: 10350
diff changeset
157 for (octave_idx_type i = 0; i < na; i++)
81067c72361f optimize kron
Jaroslav Hajek <highegg@gmail.com>
parents: 10350
diff changeset
158 for (octave_idx_type j = 0; j < nb; j++)
81067c72361f optimize kron
Jaroslav Hajek <highegg@gmail.com>
parents: 10350
diff changeset
159 pc[i*nb+j] = pa[i]*nb+pb[j];
81067c72361f optimize kron
Jaroslav Hajek <highegg@gmail.com>
parents: 10350
diff changeset
160 }
81067c72361f optimize kron
Jaroslav Hajek <highegg@gmail.com>
parents: 10350
diff changeset
161
81067c72361f optimize kron
Jaroslav Hajek <highegg@gmail.com>
parents: 10350
diff changeset
162 return c;
81067c72361f optimize kron
Jaroslav Hajek <highegg@gmail.com>
parents: 10350
diff changeset
163 }
7455
fe332ce262b5 eliminate spkron.cc; dispatch in kron
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
164
10461
81067c72361f optimize kron
Jaroslav Hajek <highegg@gmail.com>
parents: 10350
diff changeset
165 template <class MTA, class MTB>
81067c72361f optimize kron
Jaroslav Hajek <highegg@gmail.com>
parents: 10350
diff changeset
166 octave_value
81067c72361f optimize kron
Jaroslav Hajek <highegg@gmail.com>
parents: 10350
diff changeset
167 do_kron (const octave_value& a, const octave_value& b)
81067c72361f optimize kron
Jaroslav Hajek <highegg@gmail.com>
parents: 10350
diff changeset
168 {
81067c72361f optimize kron
Jaroslav Hajek <highegg@gmail.com>
parents: 10350
diff changeset
169 MTA am = octave_value_extract<MTA> (a);
81067c72361f optimize kron
Jaroslav Hajek <highegg@gmail.com>
parents: 10350
diff changeset
170 MTB bm = octave_value_extract<MTB> (b);
81067c72361f optimize kron
Jaroslav Hajek <highegg@gmail.com>
parents: 10350
diff changeset
171 return octave_value (kron (am, bm));
81067c72361f optimize kron
Jaroslav Hajek <highegg@gmail.com>
parents: 10350
diff changeset
172 }
81067c72361f optimize kron
Jaroslav Hajek <highegg@gmail.com>
parents: 10350
diff changeset
173
13748
77857d6fe074 Allow more than two input arguments for the kron function, plus some cleanup.
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 12790
diff changeset
174 octave_value
77857d6fe074 Allow more than two input arguments for the kron function, plus some cleanup.
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 12790
diff changeset
175 dispatch_kron (const octave_value& a, const octave_value& b)
77857d6fe074 Allow more than two input arguments for the kron function, plus some cleanup.
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 12790
diff changeset
176 {
77857d6fe074 Allow more than two input arguments for the kron function, plus some cleanup.
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 12790
diff changeset
177 octave_value retval;
77857d6fe074 Allow more than two input arguments for the kron function, plus some cleanup.
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 12790
diff changeset
178 if (a.is_perm_matrix () && b.is_perm_matrix ())
77857d6fe074 Allow more than two input arguments for the kron function, plus some cleanup.
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 12790
diff changeset
179 retval = do_kron<PermMatrix, PermMatrix> (a, b);
15942
75cea615ade4 Check for sparse before diagonal class in kron (bug #38082)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 15195
diff changeset
180 else if (a.is_sparse_type () || b.is_sparse_type ())
75cea615ade4 Check for sparse before diagonal class in kron (bug #38082)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 15195
diff changeset
181 {
75cea615ade4 Check for sparse before diagonal class in kron (bug #38082)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 15195
diff changeset
182 if (a.is_complex_type () || b.is_complex_type ())
75cea615ade4 Check for sparse before diagonal class in kron (bug #38082)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 15195
diff changeset
183 retval = do_kron<SparseComplexMatrix, SparseComplexMatrix> (a, b);
75cea615ade4 Check for sparse before diagonal class in kron (bug #38082)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 15195
diff changeset
184 else
75cea615ade4 Check for sparse before diagonal class in kron (bug #38082)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 15195
diff changeset
185 retval = do_kron<SparseMatrix, SparseMatrix> (a, b);
75cea615ade4 Check for sparse before diagonal class in kron (bug #38082)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 15195
diff changeset
186 }
13748
77857d6fe074 Allow more than two input arguments for the kron function, plus some cleanup.
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 12790
diff changeset
187 else if (a.is_diag_matrix ())
77857d6fe074 Allow more than two input arguments for the kron function, plus some cleanup.
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 12790
diff changeset
188 {
77857d6fe074 Allow more than two input arguments for the kron function, plus some cleanup.
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 12790
diff changeset
189 if (b.is_diag_matrix () && a.rows () == a.columns ()
77857d6fe074 Allow more than two input arguments for the kron function, plus some cleanup.
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 12790
diff changeset
190 && b.rows () == b.columns ())
77857d6fe074 Allow more than two input arguments for the kron function, plus some cleanup.
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 12790
diff changeset
191 {
14555
6eabd81604b5 allow kron to work for two diag matrix arguments (bug #35647)
John W. Eaton <jwe@octave.org>
parents: 14138
diff changeset
192 // We have two diagonal matrices, the product of those will be
6eabd81604b5 allow kron to work for two diag matrix arguments (bug #35647)
John W. Eaton <jwe@octave.org>
parents: 14138
diff changeset
193 // another diagonal matrix. To do that efficiently, extract
6eabd81604b5 allow kron to work for two diag matrix arguments (bug #35647)
John W. Eaton <jwe@octave.org>
parents: 14138
diff changeset
194 // the diagonals as vectors and compute the product. That
6eabd81604b5 allow kron to work for two diag matrix arguments (bug #35647)
John W. Eaton <jwe@octave.org>
parents: 14138
diff changeset
195 // will be another vector, which we then use to construct a
6eabd81604b5 allow kron to work for two diag matrix arguments (bug #35647)
John W. Eaton <jwe@octave.org>
parents: 14138
diff changeset
196 // diagonal matrix object. Note that this will fail if our
6eabd81604b5 allow kron to work for two diag matrix arguments (bug #35647)
John W. Eaton <jwe@octave.org>
parents: 14138
diff changeset
197 // digaonal matrix object is modified to allow the non-zero
6eabd81604b5 allow kron to work for two diag matrix arguments (bug #35647)
John W. Eaton <jwe@octave.org>
parents: 14138
diff changeset
198 // values to be stored off of the principal diagonal (i.e., if
6eabd81604b5 allow kron to work for two diag matrix arguments (bug #35647)
John W. Eaton <jwe@octave.org>
parents: 14138
diff changeset
199 // diag ([1,2], 3) is modified to return a diagonal matrix
6eabd81604b5 allow kron to work for two diag matrix arguments (bug #35647)
John W. Eaton <jwe@octave.org>
parents: 14138
diff changeset
200 // object instead of a full matrix object).
6eabd81604b5 allow kron to work for two diag matrix arguments (bug #35647)
John W. Eaton <jwe@octave.org>
parents: 14138
diff changeset
201
6eabd81604b5 allow kron to work for two diag matrix arguments (bug #35647)
John W. Eaton <jwe@octave.org>
parents: 14138
diff changeset
202 octave_value tmp = dispatch_kron (a.diag (), b.diag ());
6eabd81604b5 allow kron to work for two diag matrix arguments (bug #35647)
John W. Eaton <jwe@octave.org>
parents: 14138
diff changeset
203 retval = tmp.diag ();
13748
77857d6fe074 Allow more than two input arguments for the kron function, plus some cleanup.
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 12790
diff changeset
204 }
77857d6fe074 Allow more than two input arguments for the kron function, plus some cleanup.
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 12790
diff changeset
205 else if (a.is_single_type () || b.is_single_type ())
77857d6fe074 Allow more than two input arguments for the kron function, plus some cleanup.
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 12790
diff changeset
206 {
77857d6fe074 Allow more than two input arguments for the kron function, plus some cleanup.
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 12790
diff changeset
207 if (a.is_complex_type ())
77857d6fe074 Allow more than two input arguments for the kron function, plus some cleanup.
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 12790
diff changeset
208 retval = do_kron<FloatComplexDiagMatrix, FloatComplexMatrix> (a, b);
77857d6fe074 Allow more than two input arguments for the kron function, plus some cleanup.
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 12790
diff changeset
209 else if (b.is_complex_type ())
77857d6fe074 Allow more than two input arguments for the kron function, plus some cleanup.
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 12790
diff changeset
210 retval = do_kron<FloatDiagMatrix, FloatComplexMatrix> (a, b);
77857d6fe074 Allow more than two input arguments for the kron function, plus some cleanup.
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 12790
diff changeset
211 else
77857d6fe074 Allow more than two input arguments for the kron function, plus some cleanup.
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 12790
diff changeset
212 retval = do_kron<FloatDiagMatrix, FloatMatrix> (a, b);
77857d6fe074 Allow more than two input arguments for the kron function, plus some cleanup.
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 12790
diff changeset
213 }
77857d6fe074 Allow more than two input arguments for the kron function, plus some cleanup.
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 12790
diff changeset
214 else
77857d6fe074 Allow more than two input arguments for the kron function, plus some cleanup.
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 12790
diff changeset
215 {
77857d6fe074 Allow more than two input arguments for the kron function, plus some cleanup.
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 12790
diff changeset
216 if (a.is_complex_type ())
77857d6fe074 Allow more than two input arguments for the kron function, plus some cleanup.
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 12790
diff changeset
217 retval = do_kron<ComplexDiagMatrix, ComplexMatrix> (a, b);
77857d6fe074 Allow more than two input arguments for the kron function, plus some cleanup.
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 12790
diff changeset
218 else if (b.is_complex_type ())
77857d6fe074 Allow more than two input arguments for the kron function, plus some cleanup.
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 12790
diff changeset
219 retval = do_kron<DiagMatrix, ComplexMatrix> (a, b);
77857d6fe074 Allow more than two input arguments for the kron function, plus some cleanup.
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 12790
diff changeset
220 else
77857d6fe074 Allow more than two input arguments for the kron function, plus some cleanup.
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 12790
diff changeset
221 retval = do_kron<DiagMatrix, Matrix> (a, b);
77857d6fe074 Allow more than two input arguments for the kron function, plus some cleanup.
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 12790
diff changeset
222 }
77857d6fe074 Allow more than two input arguments for the kron function, plus some cleanup.
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 12790
diff changeset
223 }
77857d6fe074 Allow more than two input arguments for the kron function, plus some cleanup.
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 12790
diff changeset
224 else if (a.is_single_type () || b.is_single_type ())
77857d6fe074 Allow more than two input arguments for the kron function, plus some cleanup.
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 12790
diff changeset
225 {
77857d6fe074 Allow more than two input arguments for the kron function, plus some cleanup.
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 12790
diff changeset
226 if (a.is_complex_type ())
77857d6fe074 Allow more than two input arguments for the kron function, plus some cleanup.
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 12790
diff changeset
227 retval = do_kron<FloatComplexMatrix, FloatComplexMatrix> (a, b);
77857d6fe074 Allow more than two input arguments for the kron function, plus some cleanup.
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 12790
diff changeset
228 else if (b.is_complex_type ())
77857d6fe074 Allow more than two input arguments for the kron function, plus some cleanup.
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 12790
diff changeset
229 retval = do_kron<FloatMatrix, FloatComplexMatrix> (a, b);
77857d6fe074 Allow more than two input arguments for the kron function, plus some cleanup.
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 12790
diff changeset
230 else
77857d6fe074 Allow more than two input arguments for the kron function, plus some cleanup.
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 12790
diff changeset
231 retval = do_kron<FloatMatrix, FloatMatrix> (a, b);
77857d6fe074 Allow more than two input arguments for the kron function, plus some cleanup.
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 12790
diff changeset
232 }
77857d6fe074 Allow more than two input arguments for the kron function, plus some cleanup.
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 12790
diff changeset
233 else
77857d6fe074 Allow more than two input arguments for the kron function, plus some cleanup.
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 12790
diff changeset
234 {
77857d6fe074 Allow more than two input arguments for the kron function, plus some cleanup.
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 12790
diff changeset
235 if (a.is_complex_type ())
77857d6fe074 Allow more than two input arguments for the kron function, plus some cleanup.
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 12790
diff changeset
236 retval = do_kron<ComplexMatrix, ComplexMatrix> (a, b);
77857d6fe074 Allow more than two input arguments for the kron function, plus some cleanup.
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 12790
diff changeset
237 else if (b.is_complex_type ())
77857d6fe074 Allow more than two input arguments for the kron function, plus some cleanup.
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 12790
diff changeset
238 retval = do_kron<Matrix, ComplexMatrix> (a, b);
77857d6fe074 Allow more than two input arguments for the kron function, plus some cleanup.
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 12790
diff changeset
239 else
77857d6fe074 Allow more than two input arguments for the kron function, plus some cleanup.
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 12790
diff changeset
240 retval = do_kron<Matrix, Matrix> (a, b);
77857d6fe074 Allow more than two input arguments for the kron function, plus some cleanup.
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 12790
diff changeset
241 }
77857d6fe074 Allow more than two input arguments for the kron function, plus some cleanup.
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 12790
diff changeset
242 return retval;
77857d6fe074 Allow more than two input arguments for the kron function, plus some cleanup.
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 12790
diff changeset
243 }
77857d6fe074 Allow more than two input arguments for the kron function, plus some cleanup.
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 12790
diff changeset
244
10461
81067c72361f optimize kron
Jaroslav Hajek <highegg@gmail.com>
parents: 10350
diff changeset
245
15039
e753177cde93 maint: Move non-dynamically linked functions from DLD-FUNCTIONS/ to corefcn/ directory
Rik <rik@octave.org>
parents: 14854
diff changeset
246 DEFUN (kron, args, , "-*- texinfo -*-\n\
e753177cde93 maint: Move non-dynamically linked functions from DLD-FUNCTIONS/ to corefcn/ directory
Rik <rik@octave.org>
parents: 14854
diff changeset
247 @deftypefn {Built-in Function} {} kron (@var{A}, @var{B})\n\
e753177cde93 maint: Move non-dynamically linked functions from DLD-FUNCTIONS/ to corefcn/ directory
Rik <rik@octave.org>
parents: 14854
diff changeset
248 @deftypefnx {Built-in Function} {} kron (@var{A1}, @var{A2}, @dots{})\n\
13748
77857d6fe074 Allow more than two input arguments for the kron function, plus some cleanup.
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 12790
diff changeset
249 Form the Kronecker product of two or more matrices, defined block by \n\
77857d6fe074 Allow more than two input arguments for the kron function, plus some cleanup.
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 12790
diff changeset
250 block as\n\
3910
79a90a0f0eff [project @ 2002-04-25 05:36:52 by jwe]
jwe
parents:
diff changeset
251 \n\
79a90a0f0eff [project @ 2002-04-25 05:36:52 by jwe]
jwe
parents:
diff changeset
252 @example\n\
14360
97883071e8e4 doc: Correct off-by-1 spacings in all .cc docstrings
Rik <octave@nomad.inbox5.com>
parents: 14138
diff changeset
253 x = [ a(i,j)*b ]\n\
3910
79a90a0f0eff [project @ 2002-04-25 05:36:52 by jwe]
jwe
parents:
diff changeset
254 @end example\n\
79a90a0f0eff [project @ 2002-04-25 05:36:52 by jwe]
jwe
parents:
diff changeset
255 \n\
10840
89f4d7e294cc Grammarcheck .cc files
Rik <octave@nomad.inbox5.com>
parents: 10527
diff changeset
256 For example:\n\
3910
79a90a0f0eff [project @ 2002-04-25 05:36:52 by jwe]
jwe
parents:
diff changeset
257 \n\
79a90a0f0eff [project @ 2002-04-25 05:36:52 by jwe]
jwe
parents:
diff changeset
258 @example\n\
79a90a0f0eff [project @ 2002-04-25 05:36:52 by jwe]
jwe
parents:
diff changeset
259 @group\n\
79a90a0f0eff [project @ 2002-04-25 05:36:52 by jwe]
jwe
parents:
diff changeset
260 kron (1:4, ones (3, 1))\n\
14360
97883071e8e4 doc: Correct off-by-1 spacings in all .cc docstrings
Rik <octave@nomad.inbox5.com>
parents: 14138
diff changeset
261 @result{} 1 2 3 4\n\
97883071e8e4 doc: Correct off-by-1 spacings in all .cc docstrings
Rik <octave@nomad.inbox5.com>
parents: 14138
diff changeset
262 1 2 3 4\n\
97883071e8e4 doc: Correct off-by-1 spacings in all .cc docstrings
Rik <octave@nomad.inbox5.com>
parents: 14138
diff changeset
263 1 2 3 4\n\
3910
79a90a0f0eff [project @ 2002-04-25 05:36:52 by jwe]
jwe
parents:
diff changeset
264 @end group\n\
79a90a0f0eff [project @ 2002-04-25 05:36:52 by jwe]
jwe
parents:
diff changeset
265 @end example\n\
13748
77857d6fe074 Allow more than two input arguments for the kron function, plus some cleanup.
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 12790
diff changeset
266 \n\
77857d6fe074 Allow more than two input arguments for the kron function, plus some cleanup.
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 12790
diff changeset
267 If there are more than two input arguments @var{A1}, @var{A2}, @dots{}, \n\
77857d6fe074 Allow more than two input arguments for the kron function, plus some cleanup.
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 12790
diff changeset
268 @var{An} the Kronecker product is computed as\n\
77857d6fe074 Allow more than two input arguments for the kron function, plus some cleanup.
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 12790
diff changeset
269 \n\
77857d6fe074 Allow more than two input arguments for the kron function, plus some cleanup.
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 12790
diff changeset
270 @example\n\
77857d6fe074 Allow more than two input arguments for the kron function, plus some cleanup.
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 12790
diff changeset
271 kron (kron (@var{A1}, @var{A2}), @dots{}, @var{An})\n\
77857d6fe074 Allow more than two input arguments for the kron function, plus some cleanup.
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 12790
diff changeset
272 @end example\n\
77857d6fe074 Allow more than two input arguments for the kron function, plus some cleanup.
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 12790
diff changeset
273 \n\
77857d6fe074 Allow more than two input arguments for the kron function, plus some cleanup.
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 12790
diff changeset
274 @noindent\n\
77857d6fe074 Allow more than two input arguments for the kron function, plus some cleanup.
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 12790
diff changeset
275 Since the Kronecker product is associative, this is well-defined.\n\
3910
79a90a0f0eff [project @ 2002-04-25 05:36:52 by jwe]
jwe
parents:
diff changeset
276 @end deftypefn")
79a90a0f0eff [project @ 2002-04-25 05:36:52 by jwe]
jwe
parents:
diff changeset
277 {
10461
81067c72361f optimize kron
Jaroslav Hajek <highegg@gmail.com>
parents: 10350
diff changeset
278 octave_value retval;
3910
79a90a0f0eff [project @ 2002-04-25 05:36:52 by jwe]
jwe
parents:
diff changeset
279
79a90a0f0eff [project @ 2002-04-25 05:36:52 by jwe]
jwe
parents:
diff changeset
280 int nargin = args.length ();
79a90a0f0eff [project @ 2002-04-25 05:36:52 by jwe]
jwe
parents:
diff changeset
281
13748
77857d6fe074 Allow more than two input arguments for the kron function, plus some cleanup.
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 12790
diff changeset
282 if (nargin >= 2)
3910
79a90a0f0eff [project @ 2002-04-25 05:36:52 by jwe]
jwe
parents:
diff changeset
283 {
10461
81067c72361f optimize kron
Jaroslav Hajek <highegg@gmail.com>
parents: 10350
diff changeset
284 octave_value a = args(0), b = args(1);
13748
77857d6fe074 Allow more than two input arguments for the kron function, plus some cleanup.
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 12790
diff changeset
285 retval = dispatch_kron (a, b);
77857d6fe074 Allow more than two input arguments for the kron function, plus some cleanup.
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 12790
diff changeset
286 for (octave_idx_type i = 2; i < nargin; i++)
77857d6fe074 Allow more than two input arguments for the kron function, plus some cleanup.
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 12790
diff changeset
287 retval = dispatch_kron (retval, args(i));
3910
79a90a0f0eff [project @ 2002-04-25 05:36:52 by jwe]
jwe
parents:
diff changeset
288 }
13748
77857d6fe074 Allow more than two input arguments for the kron function, plus some cleanup.
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 12790
diff changeset
289 else
77857d6fe074 Allow more than two input arguments for the kron function, plus some cleanup.
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 12790
diff changeset
290 print_usage ();
3910
79a90a0f0eff [project @ 2002-04-25 05:36:52 by jwe]
jwe
parents:
diff changeset
291
79a90a0f0eff [project @ 2002-04-25 05:36:52 by jwe]
jwe
parents:
diff changeset
292 return retval;
79a90a0f0eff [project @ 2002-04-25 05:36:52 by jwe]
jwe
parents:
diff changeset
293 }
12790
5ecdb60ddf0f codesprint: Write two tests for kron.cc
Jordi Gutiérrez Hermoso <jordigh@gmail.com>
parents: 11586
diff changeset
294
13748
77857d6fe074 Allow more than two input arguments for the kron function, plus some cleanup.
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 12790
diff changeset
295
12790
5ecdb60ddf0f codesprint: Write two tests for kron.cc
Jordi Gutiérrez Hermoso <jordigh@gmail.com>
parents: 11586
diff changeset
296 /*
5ecdb60ddf0f codesprint: Write two tests for kron.cc
Jordi Gutiérrez Hermoso <jordigh@gmail.com>
parents: 11586
diff changeset
297 %!test
14501
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14360
diff changeset
298 %! x = ones (2);
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14360
diff changeset
299 %! assert (kron (x, x), ones (4));
12790
5ecdb60ddf0f codesprint: Write two tests for kron.cc
Jordi Gutiérrez Hermoso <jordigh@gmail.com>
parents: 11586
diff changeset
300
13748
77857d6fe074 Allow more than two input arguments for the kron function, plus some cleanup.
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 12790
diff changeset
301 %!shared x, y, z
77857d6fe074 Allow more than two input arguments for the kron function, plus some cleanup.
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 12790
diff changeset
302 %! x = [1, 2];
77857d6fe074 Allow more than two input arguments for the kron function, plus some cleanup.
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 12790
diff changeset
303 %! y = [-1, -2];
12790
5ecdb60ddf0f codesprint: Write two tests for kron.cc
Jordi Gutiérrez Hermoso <jordigh@gmail.com>
parents: 11586
diff changeset
304 %! z = [1, 2, 3, 4; 1, 2, 3, 4; 1, 2, 3, 4];
13748
77857d6fe074 Allow more than two input arguments for the kron function, plus some cleanup.
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 12790
diff changeset
305 %!assert (kron (1:4, ones (3, 1)), z)
77857d6fe074 Allow more than two input arguments for the kron function, plus some cleanup.
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 12790
diff changeset
306 %!assert (kron (x, y, z), kron (kron (x, y), z))
77857d6fe074 Allow more than two input arguments for the kron function, plus some cleanup.
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 12790
diff changeset
307 %!assert (kron (x, y, z), kron (x, kron (y, z)))
12790
5ecdb60ddf0f codesprint: Write two tests for kron.cc
Jordi Gutiérrez Hermoso <jordigh@gmail.com>
parents: 11586
diff changeset
308
14555
6eabd81604b5 allow kron to work for two diag matrix arguments (bug #35647)
John W. Eaton <jwe@octave.org>
parents: 14138
diff changeset
309 %!assert (kron (diag ([1, 2]), diag ([3, 4])), diag ([3, 4, 6, 8]))
6eabd81604b5 allow kron to work for two diag matrix arguments (bug #35647)
John W. Eaton <jwe@octave.org>
parents: 14138
diff changeset
310
6eabd81604b5 allow kron to work for two diag matrix arguments (bug #35647)
John W. Eaton <jwe@octave.org>
parents: 14138
diff changeset
311 %% Test for two diag matrices. See the comments above in
6eabd81604b5 allow kron to work for two diag matrix arguments (bug #35647)
John W. Eaton <jwe@octave.org>
parents: 14138
diff changeset
312 %% dispatch_kron for this case.
6eabd81604b5 allow kron to work for two diag matrix arguments (bug #35647)
John W. Eaton <jwe@octave.org>
parents: 14138
diff changeset
313 %%
6eabd81604b5 allow kron to work for two diag matrix arguments (bug #35647)
John W. Eaton <jwe@octave.org>
parents: 14138
diff changeset
314 %!test
6eabd81604b5 allow kron to work for two diag matrix arguments (bug #35647)
John W. Eaton <jwe@octave.org>
parents: 14138
diff changeset
315 %! expected = zeros (16, 16);
6eabd81604b5 allow kron to work for two diag matrix arguments (bug #35647)
John W. Eaton <jwe@octave.org>
parents: 14138
diff changeset
316 %! expected (1, 11) = 3;
6eabd81604b5 allow kron to work for two diag matrix arguments (bug #35647)
John W. Eaton <jwe@octave.org>
parents: 14138
diff changeset
317 %! expected (2, 12) = 4;
6eabd81604b5 allow kron to work for two diag matrix arguments (bug #35647)
John W. Eaton <jwe@octave.org>
parents: 14138
diff changeset
318 %! expected (5, 15) = 6;
6eabd81604b5 allow kron to work for two diag matrix arguments (bug #35647)
John W. Eaton <jwe@octave.org>
parents: 14138
diff changeset
319 %! expected (6, 16) = 8;
6eabd81604b5 allow kron to work for two diag matrix arguments (bug #35647)
John W. Eaton <jwe@octave.org>
parents: 14138
diff changeset
320 %! assert (kron (diag ([1, 2], 2), diag ([3, 4], 2)), expected)
12790
5ecdb60ddf0f codesprint: Write two tests for kron.cc
Jordi Gutiérrez Hermoso <jordigh@gmail.com>
parents: 11586
diff changeset
321 */