annotate libinterp/corefcn/kron.cc @ 18849:aa9ca67f09fb

make all permutation matrices column permutations (bug #42418) Making all permutation matrices column permutations allows permutation matrices to be iterated over in column-major order just like any other matrix. * PermMatrix.h, PermMatrix.cc (PermMatrix::_colp): Delete member variable and all uses. (PermMatrix::transpose): Create new matrix with internal representation flipped. (PermMatrix::pos_power): New function. (PermMatrix::eye): Call the one-argument constructor which already defaults to the identity matrix. (PermMatrix::is_col_perm): Unconditionally return true. (PermMatrix::is_row_perm): Unconditionally return false. (PermMatrix::data, PermMatrix::fortran_vec, PermMatrix::pvec): Delete. (PermMatrix::col_perm_vec): New function. * lu.cc: New test. * base-lu.cc (base_lu<lu_type>::base_lu): Call transpose in ipvt initialization. * find.cc, kron.cc, pr-output.cc, ov-perm.cc, PermMatrix.cc, PermMatrix.h, Sparse.cc, dMatrix.cc, fMatrix.cc, CmplxQRP.cc, base-lu.cc, dbleQRP.cc, fCmplxQRP.cc, floatQRP.cc, Sparse-perm-op-defs.h, mx-op-defs.h: Adapt to PermMatrix changes.
author David Spies <dnspies@gmail.com>
date Wed, 18 Jun 2014 19:38:40 -0600
parents 9ac2357f19bc
children 38c54d45d05f
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
17744
d63878346099 maint: Update copyright notices for release.
John W. Eaton <jwe@octave.org>
parents: 15942
diff changeset
3 Copyright (C) 2002-2013 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
18100
6a71e5030df5 Follow coding convention of defining and initializing only 1 variable per line in liboctinterp.
Rik <rik@octave.org>
parents: 17787
diff changeset
58 octave_idx_type nra = a.rows ();
6a71e5030df5 Follow coding convention of defining and initializing only 1 variable per line in liboctinterp.
Rik <rik@octave.org>
parents: 17787
diff changeset
59 octave_idx_type nrb = b.rows ();
6a71e5030df5 Follow coding convention of defining and initializing only 1 variable per line in liboctinterp.
Rik <rik@octave.org>
parents: 17787
diff changeset
60 octave_idx_type nca = a.cols ();
6a71e5030df5 Follow coding convention of defining and initializing only 1 variable per line in liboctinterp.
Rik <rik@octave.org>
parents: 17787
diff changeset
61 octave_idx_type ncb = b.cols ();
3910
79a90a0f0eff [project @ 2002-04-25 05:36:52 by jwe]
jwe
parents:
diff changeset
62
11570
57632dea2446 attempt better backward compatibility for Array constructors
John W. Eaton <jwe@octave.org>
parents: 11553
diff changeset
63 MArray<T> c (dim_vector (nra*nrb, nca*ncb));
10461
81067c72361f optimize kron
Jaroslav Hajek <highegg@gmail.com>
parents: 10350
diff changeset
64 T *cv = c.fortran_vec ();
81067c72361f optimize kron
Jaroslav Hajek <highegg@gmail.com>
parents: 10350
diff changeset
65
81067c72361f optimize kron
Jaroslav Hajek <highegg@gmail.com>
parents: 10350
diff changeset
66 for (octave_idx_type ja = 0; ja < nca; ja++)
81067c72361f optimize kron
Jaroslav Hajek <highegg@gmail.com>
parents: 10350
diff changeset
67 for (octave_idx_type jb = 0; jb < ncb; jb++)
81067c72361f optimize kron
Jaroslav Hajek <highegg@gmail.com>
parents: 10350
diff changeset
68 for (octave_idx_type ia = 0; ia < nra; ia++)
81067c72361f optimize kron
Jaroslav Hajek <highegg@gmail.com>
parents: 10350
diff changeset
69 {
81067c72361f optimize kron
Jaroslav Hajek <highegg@gmail.com>
parents: 10350
diff changeset
70 octave_quit ();
81067c72361f optimize kron
Jaroslav Hajek <highegg@gmail.com>
parents: 10350
diff changeset
71 mx_inline_mul (nrb, cv, a(ia, ja), b.data () + nrb*jb);
81067c72361f optimize kron
Jaroslav Hajek <highegg@gmail.com>
parents: 10350
diff changeset
72 cv += nrb;
81067c72361f optimize kron
Jaroslav Hajek <highegg@gmail.com>
parents: 10350
diff changeset
73 }
7789
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7455
diff changeset
74
10461
81067c72361f optimize kron
Jaroslav Hajek <highegg@gmail.com>
parents: 10350
diff changeset
75 return c;
81067c72361f optimize kron
Jaroslav Hajek <highegg@gmail.com>
parents: 10350
diff changeset
76 }
81067c72361f optimize kron
Jaroslav Hajek <highegg@gmail.com>
parents: 10350
diff changeset
77
81067c72361f optimize kron
Jaroslav Hajek <highegg@gmail.com>
parents: 10350
diff changeset
78 template <class R, class T>
81067c72361f optimize kron
Jaroslav Hajek <highegg@gmail.com>
parents: 10350
diff changeset
79 static MArray<T>
81067c72361f optimize kron
Jaroslav Hajek <highegg@gmail.com>
parents: 10350
diff changeset
80 kron (const MDiagArray2<R>& a, const MArray<T>& b)
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 assert (b.ndims () == 2);
81067c72361f optimize kron
Jaroslav Hajek <highegg@gmail.com>
parents: 10350
diff changeset
83
18100
6a71e5030df5 Follow coding convention of defining and initializing only 1 variable per line in liboctinterp.
Rik <rik@octave.org>
parents: 17787
diff changeset
84 octave_idx_type nra = a.rows ();
6a71e5030df5 Follow coding convention of defining and initializing only 1 variable per line in liboctinterp.
Rik <rik@octave.org>
parents: 17787
diff changeset
85 octave_idx_type nrb = b.rows ();
6a71e5030df5 Follow coding convention of defining and initializing only 1 variable per line in liboctinterp.
Rik <rik@octave.org>
parents: 17787
diff changeset
86 octave_idx_type dla = a.diag_length ();
6a71e5030df5 Follow coding convention of defining and initializing only 1 variable per line in liboctinterp.
Rik <rik@octave.org>
parents: 17787
diff changeset
87 octave_idx_type nca = a.cols ();
6a71e5030df5 Follow coding convention of defining and initializing only 1 variable per line in liboctinterp.
Rik <rik@octave.org>
parents: 17787
diff changeset
88 octave_idx_type ncb = b.cols ();
7789
82be108cc558 First attempt at single precision tyeps
David Bateman <dbateman@free.fr>
parents: 7455
diff changeset
89
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
90 MArray<T> c (dim_vector (nra*nrb, nca*ncb), T ());
10461
81067c72361f optimize kron
Jaroslav Hajek <highegg@gmail.com>
parents: 10350
diff changeset
91
81067c72361f optimize kron
Jaroslav Hajek <highegg@gmail.com>
parents: 10350
diff changeset
92 for (octave_idx_type ja = 0; ja < dla; ja++)
81067c72361f optimize kron
Jaroslav Hajek <highegg@gmail.com>
parents: 10350
diff changeset
93 for (octave_idx_type jb = 0; jb < ncb; jb++)
81067c72361f optimize kron
Jaroslav Hajek <highegg@gmail.com>
parents: 10350
diff changeset
94 {
81067c72361f optimize kron
Jaroslav Hajek <highegg@gmail.com>
parents: 10350
diff changeset
95 octave_quit ();
17787
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
96 mx_inline_mul (nrb, &c.xelem (ja*nrb, ja*ncb + jb), a.dgelem (ja),
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
97 b.data () + nrb*jb);
10461
81067c72361f optimize kron
Jaroslav Hajek <highegg@gmail.com>
parents: 10350
diff changeset
98 }
81067c72361f optimize kron
Jaroslav Hajek <highegg@gmail.com>
parents: 10350
diff changeset
99
81067c72361f optimize kron
Jaroslav Hajek <highegg@gmail.com>
parents: 10350
diff changeset
100 return c;
81067c72361f optimize kron
Jaroslav Hajek <highegg@gmail.com>
parents: 10350
diff changeset
101 }
3910
79a90a0f0eff [project @ 2002-04-25 05:36:52 by jwe]
jwe
parents:
diff changeset
102
79a90a0f0eff [project @ 2002-04-25 05:36:52 by jwe]
jwe
parents:
diff changeset
103 template <class T>
10461
81067c72361f optimize kron
Jaroslav Hajek <highegg@gmail.com>
parents: 10350
diff changeset
104 static MSparse<T>
81067c72361f optimize kron
Jaroslav Hajek <highegg@gmail.com>
parents: 10350
diff changeset
105 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
106 {
fe332ce262b5 eliminate spkron.cc; dispatch in kron
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
107 octave_idx_type idx = 0;
11586
12df7854fa7c strip trailing whitespace from source files
John W. Eaton <jwe@octave.org>
parents: 11570
diff changeset
108 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
109 A.nnz () * B.nnz ());
7455
fe332ce262b5 eliminate spkron.cc; dispatch in kron
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
110
fe332ce262b5 eliminate spkron.cc; dispatch in kron
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
111 C.cidx (0) = 0;
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 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
114 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
115 {
10461
81067c72361f optimize kron
Jaroslav Hajek <highegg@gmail.com>
parents: 10350
diff changeset
116 octave_quit ();
10154
40dfc0c99116 DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents: 9209
diff changeset
117 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
118 {
14854
5ae9f0f77635 maint: Use Octave coding conventions for coddling parenthis is DLD-FUNCTIONS directory
Rik <octave@nomad.inbox5.com>
parents: 14846
diff changeset
119 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
120 const T v = A.data (Ai);
7455
fe332ce262b5 eliminate spkron.cc; dispatch in kron
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
121
10154
40dfc0c99116 DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents: 9209
diff changeset
122 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
123 {
40dfc0c99116 DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents: 9209
diff changeset
124 C.data (idx) = v * B.data (Bi);
40dfc0c99116 DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents: 9209
diff changeset
125 C.ridx (idx++) = Ci + B.ridx (Bi);
40dfc0c99116 DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents: 9209
diff changeset
126 }
40dfc0c99116 DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents: 9209
diff changeset
127 }
40dfc0c99116 DLD-FUNCTIONS/*.cc: untabify
John W. Eaton <jwe@octave.org>
parents: 9209
diff changeset
128 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
129 }
10461
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 return C;
7455
fe332ce262b5 eliminate spkron.cc; dispatch in kron
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
132 }
fe332ce262b5 eliminate spkron.cc; dispatch in kron
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
133
10461
81067c72361f optimize kron
Jaroslav Hajek <highegg@gmail.com>
parents: 10350
diff changeset
134 static PermMatrix
81067c72361f optimize kron
Jaroslav Hajek <highegg@gmail.com>
parents: 10350
diff changeset
135 kron (const PermMatrix& a, const PermMatrix& b)
81067c72361f optimize kron
Jaroslav Hajek <highegg@gmail.com>
parents: 10350
diff changeset
136 {
18100
6a71e5030df5 Follow coding convention of defining and initializing only 1 variable per line in liboctinterp.
Rik <rik@octave.org>
parents: 17787
diff changeset
137 octave_idx_type na = a.rows ();
6a71e5030df5 Follow coding convention of defining and initializing only 1 variable per line in liboctinterp.
Rik <rik@octave.org>
parents: 17787
diff changeset
138 octave_idx_type nb = b.rows ();
18849
aa9ca67f09fb make all permutation matrices column permutations (bug #42418)
David Spies <dnspies@gmail.com>
parents: 18812
diff changeset
139 const Array<octave_idx_type>& pa = a.col_perm_vec ();
aa9ca67f09fb make all permutation matrices column permutations (bug #42418)
David Spies <dnspies@gmail.com>
parents: 18812
diff changeset
140 const Array<octave_idx_type>& pb = b.col_perm_vec ();
aa9ca67f09fb make all permutation matrices column permutations (bug #42418)
David Spies <dnspies@gmail.com>
parents: 18812
diff changeset
141 Array<octave_idx_type> res_perm;
aa9ca67f09fb make all permutation matrices column permutations (bug #42418)
David Spies <dnspies@gmail.com>
parents: 18812
diff changeset
142 octave_idx_type rescol = 0;
aa9ca67f09fb make all permutation matrices column permutations (bug #42418)
David Spies <dnspies@gmail.com>
parents: 18812
diff changeset
143 for (octave_idx_type i = 0; i < na; i++)
10461
81067c72361f optimize kron
Jaroslav Hajek <highegg@gmail.com>
parents: 10350
diff changeset
144 {
18849
aa9ca67f09fb make all permutation matrices column permutations (bug #42418)
David Spies <dnspies@gmail.com>
parents: 18812
diff changeset
145 octave_idx_type a_add = pa(i) * nb;
aa9ca67f09fb make all permutation matrices column permutations (bug #42418)
David Spies <dnspies@gmail.com>
parents: 18812
diff changeset
146 for (octave_idx_type j = 0; j < nb; j++)
aa9ca67f09fb make all permutation matrices column permutations (bug #42418)
David Spies <dnspies@gmail.com>
parents: 18812
diff changeset
147 res_perm.xelem (rescol++) = a_add + pb(j);
10461
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
18849
aa9ca67f09fb make all permutation matrices column permutations (bug #42418)
David Spies <dnspies@gmail.com>
parents: 18812
diff changeset
150 return PermMatrix (res_perm, true);
10461
81067c72361f optimize kron
Jaroslav Hajek <highegg@gmail.com>
parents: 10350
diff changeset
151 }
7455
fe332ce262b5 eliminate spkron.cc; dispatch in kron
David Bateman <dbateman@free.fr>
parents: 7017
diff changeset
152
10461
81067c72361f optimize kron
Jaroslav Hajek <highegg@gmail.com>
parents: 10350
diff changeset
153 template <class MTA, class MTB>
81067c72361f optimize kron
Jaroslav Hajek <highegg@gmail.com>
parents: 10350
diff changeset
154 octave_value
81067c72361f optimize kron
Jaroslav Hajek <highegg@gmail.com>
parents: 10350
diff changeset
155 do_kron (const octave_value& a, const octave_value& b)
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 MTA am = octave_value_extract<MTA> (a);
81067c72361f optimize kron
Jaroslav Hajek <highegg@gmail.com>
parents: 10350
diff changeset
158 MTB bm = octave_value_extract<MTB> (b);
81067c72361f optimize kron
Jaroslav Hajek <highegg@gmail.com>
parents: 10350
diff changeset
159 return octave_value (kron (am, bm));
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
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
162 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
163 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
164 {
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
165 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
166 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
167 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
168 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
169 {
75cea615ade4 Check for sparse before diagonal class in kron (bug #38082)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 15195
diff changeset
170 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
171 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
172 else
75cea615ade4 Check for sparse before diagonal class in kron (bug #38082)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 15195
diff changeset
173 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
174 }
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
175 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
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 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
178 && 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
179 {
14555
6eabd81604b5 allow kron to work for two diag matrix arguments (bug #35647)
John W. Eaton <jwe@octave.org>
parents: 14138
diff changeset
180 // 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
181 // 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
182 // 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
183 // 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
184 // diagonal matrix object. Note that this will fail if our
18812
9ac2357f19bc doc: Replace "non-zero" with "nonzero" to match existing usage.
Rik <rik@octave.org>
parents: 18100
diff changeset
185 // digaonal matrix object is modified to allow the nonzero
14555
6eabd81604b5 allow kron to work for two diag matrix arguments (bug #35647)
John W. Eaton <jwe@octave.org>
parents: 14138
diff changeset
186 // 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
187 // 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
188 // 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
189
6eabd81604b5 allow kron to work for two diag matrix arguments (bug #35647)
John W. Eaton <jwe@octave.org>
parents: 14138
diff changeset
190 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
191 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
192 }
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
193 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
194 {
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
195 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
196 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
197 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
198 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
199 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
200 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
201 }
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
202 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
203 {
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 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
205 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
206 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
207 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
208 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
209 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
210 }
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 }
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 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
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 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
215 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
216 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
217 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
218 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
219 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
220 }
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 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
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 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
224 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
225 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
226 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
227 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
228 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
229 }
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 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
231 }
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
10461
81067c72361f optimize kron
Jaroslav Hajek <highegg@gmail.com>
parents: 10350
diff changeset
233
15039
e753177cde93 maint: Move non-dynamically linked functions from DLD-FUNCTIONS/ to corefcn/ directory
Rik <rik@octave.org>
parents: 14854
diff changeset
234 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
235 @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
236 @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
237 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
238 block as\n\
3910
79a90a0f0eff [project @ 2002-04-25 05:36:52 by jwe]
jwe
parents:
diff changeset
239 \n\
79a90a0f0eff [project @ 2002-04-25 05:36:52 by jwe]
jwe
parents:
diff changeset
240 @example\n\
14360
97883071e8e4 doc: Correct off-by-1 spacings in all .cc docstrings
Rik <octave@nomad.inbox5.com>
parents: 14138
diff changeset
241 x = [ a(i,j)*b ]\n\
3910
79a90a0f0eff [project @ 2002-04-25 05:36:52 by jwe]
jwe
parents:
diff changeset
242 @end example\n\
79a90a0f0eff [project @ 2002-04-25 05:36:52 by jwe]
jwe
parents:
diff changeset
243 \n\
10840
89f4d7e294cc Grammarcheck .cc files
Rik <octave@nomad.inbox5.com>
parents: 10527
diff changeset
244 For example:\n\
3910
79a90a0f0eff [project @ 2002-04-25 05:36:52 by jwe]
jwe
parents:
diff changeset
245 \n\
79a90a0f0eff [project @ 2002-04-25 05:36:52 by jwe]
jwe
parents:
diff changeset
246 @example\n\
79a90a0f0eff [project @ 2002-04-25 05:36:52 by jwe]
jwe
parents:
diff changeset
247 @group\n\
79a90a0f0eff [project @ 2002-04-25 05:36:52 by jwe]
jwe
parents:
diff changeset
248 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
249 @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
250 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
251 1 2 3 4\n\
3910
79a90a0f0eff [project @ 2002-04-25 05:36:52 by jwe]
jwe
parents:
diff changeset
252 @end group\n\
79a90a0f0eff [project @ 2002-04-25 05:36:52 by jwe]
jwe
parents:
diff changeset
253 @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
254 \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
255 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
256 @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
257 \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
258 @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
259 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
260 @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
261 \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
262 @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
263 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
264 @end deftypefn")
79a90a0f0eff [project @ 2002-04-25 05:36:52 by jwe]
jwe
parents:
diff changeset
265 {
10461
81067c72361f optimize kron
Jaroslav Hajek <highegg@gmail.com>
parents: 10350
diff changeset
266 octave_value retval;
3910
79a90a0f0eff [project @ 2002-04-25 05:36:52 by jwe]
jwe
parents:
diff changeset
267
79a90a0f0eff [project @ 2002-04-25 05:36:52 by jwe]
jwe
parents:
diff changeset
268 int nargin = args.length ();
79a90a0f0eff [project @ 2002-04-25 05:36:52 by jwe]
jwe
parents:
diff changeset
269
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
270 if (nargin >= 2)
3910
79a90a0f0eff [project @ 2002-04-25 05:36:52 by jwe]
jwe
parents:
diff changeset
271 {
18100
6a71e5030df5 Follow coding convention of defining and initializing only 1 variable per line in liboctinterp.
Rik <rik@octave.org>
parents: 17787
diff changeset
272 octave_value a = args(0);
6a71e5030df5 Follow coding convention of defining and initializing only 1 variable per line in liboctinterp.
Rik <rik@octave.org>
parents: 17787
diff changeset
273 octave_value 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
274 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
275 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
276 retval = dispatch_kron (retval, args(i));
3910
79a90a0f0eff [project @ 2002-04-25 05:36:52 by jwe]
jwe
parents:
diff changeset
277 }
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
278 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
279 print_usage ();
3910
79a90a0f0eff [project @ 2002-04-25 05:36:52 by jwe]
jwe
parents:
diff changeset
280
79a90a0f0eff [project @ 2002-04-25 05:36:52 by jwe]
jwe
parents:
diff changeset
281 return retval;
79a90a0f0eff [project @ 2002-04-25 05:36:52 by jwe]
jwe
parents:
diff changeset
282 }
12790
5ecdb60ddf0f codesprint: Write two tests for kron.cc
Jordi Gutiérrez Hermoso <jordigh@gmail.com>
parents: 11586
diff changeset
283
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
284
12790
5ecdb60ddf0f codesprint: Write two tests for kron.cc
Jordi Gutiérrez Hermoso <jordigh@gmail.com>
parents: 11586
diff changeset
285 /*
5ecdb60ddf0f codesprint: Write two tests for kron.cc
Jordi Gutiérrez Hermoso <jordigh@gmail.com>
parents: 11586
diff changeset
286 %!test
14501
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14360
diff changeset
287 %! x = ones (2);
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14360
diff changeset
288 %! 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
289
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
290 %!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
291 %! 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
292 %! y = [-1, -2];
12790
5ecdb60ddf0f codesprint: Write two tests for kron.cc
Jordi Gutiérrez Hermoso <jordigh@gmail.com>
parents: 11586
diff changeset
293 %! 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
294 %!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
295 %!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
296 %!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
297
14555
6eabd81604b5 allow kron to work for two diag matrix arguments (bug #35647)
John W. Eaton <jwe@octave.org>
parents: 14138
diff changeset
298 %!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
299
6eabd81604b5 allow kron to work for two diag matrix arguments (bug #35647)
John W. Eaton <jwe@octave.org>
parents: 14138
diff changeset
300 %% 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
301 %% 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
302 %%
6eabd81604b5 allow kron to work for two diag matrix arguments (bug #35647)
John W. Eaton <jwe@octave.org>
parents: 14138
diff changeset
303 %!test
6eabd81604b5 allow kron to work for two diag matrix arguments (bug #35647)
John W. Eaton <jwe@octave.org>
parents: 14138
diff changeset
304 %! 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
305 %! 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
306 %! 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
307 %! 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
308 %! 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
309 %! 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
310 */