annotate libinterp/corefcn/dot.cc @ 26599:5ab12183280d

dot.cc: Call Fsum directly rather than using feval. * dot.cc (Fdot): #include "builtin-defun-decls.h" for prototypes of Octave functions. Update docstring to warn about incorrect results when using integer arrays. Add FIXME note to else branch which calculates integer results suggesting a warning or error might be appropriate. Replace feval call with direct call to Fsum. Update BIST tests to use commas in matrix definitions. Add BIST test for an int8 object which clearly calculates the wrong result.
author Rik <rik@octave.org>
date Tue, 22 Jan 2019 13:45:45 -0800
parents bc6237a189e1
children b442ec6dda5c
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
9874
90bc0cc4518f implement compiled dot and blkmm
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
1 /*
90bc0cc4518f implement compiled dot and blkmm
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
2
26376
00f796120a6d maint: Update copyright dates in all source files.
John W. Eaton <jwe@octave.org>
parents: 25606
diff changeset
3 Copyright (C) 2009-2019 VZLU Prague
9874
90bc0cc4518f implement compiled dot and blkmm
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
4
90bc0cc4518f implement compiled dot and blkmm
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
5 This file is part of Octave.
90bc0cc4518f implement compiled dot and blkmm
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
6
24534
194eb4bd202b maint: Update punctuation for GPL v3 license text.
Rik <rik@octave.org>
parents: 23592
diff changeset
7 Octave is free software: you can redistribute it and/or modify it
22755
3a2b891d0b33 maint: Standardize Copyright formatting.
Rik <rik@octave.org>
parents: 22737
diff changeset
8 under the terms of the GNU General Public License as published by
24534
194eb4bd202b maint: Update punctuation for GPL v3 license text.
Rik <rik@octave.org>
parents: 23592
diff changeset
9 the Free Software Foundation, either version 3 of the License, or
22755
3a2b891d0b33 maint: Standardize Copyright formatting.
Rik <rik@octave.org>
parents: 22737
diff changeset
10 (at your option) any later version.
9874
90bc0cc4518f implement compiled dot and blkmm
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
11
22755
3a2b891d0b33 maint: Standardize Copyright formatting.
Rik <rik@octave.org>
parents: 22737
diff changeset
12 Octave is distributed in the hope that it will be useful, but
3a2b891d0b33 maint: Standardize Copyright formatting.
Rik <rik@octave.org>
parents: 22737
diff changeset
13 WITHOUT ANY WARRANTY; without even the implied warranty of
3a2b891d0b33 maint: Standardize Copyright formatting.
Rik <rik@octave.org>
parents: 22737
diff changeset
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
3a2b891d0b33 maint: Standardize Copyright formatting.
Rik <rik@octave.org>
parents: 22737
diff changeset
15 GNU General Public License for more details.
9874
90bc0cc4518f implement compiled dot and blkmm
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
16
90bc0cc4518f implement compiled dot and blkmm
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
17 You should have received a copy of the GNU General Public License
90bc0cc4518f implement compiled dot and blkmm
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
18 along with Octave; see the file COPYING. If not, see
24534
194eb4bd202b maint: Update punctuation for GPL v3 license text.
Rik <rik@octave.org>
parents: 23592
diff changeset
19 <https://www.gnu.org/licenses/>.
9874
90bc0cc4518f implement compiled dot and blkmm
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
20
90bc0cc4518f implement compiled dot and blkmm
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
21 */
90bc0cc4518f implement compiled dot and blkmm
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
22
21724
aba2e6293dd8 use "#if ..." consistently instead of "#ifdef" and "#ifndef"
John W. Eaton <jwe@octave.org>
parents: 21660
diff changeset
23 #if defined (HAVE_CONFIG_H)
21301
40de9f8f23a6 Use '#include "config.h"' rather than <config.h>.
Rik <rik@octave.org>
parents: 21200
diff changeset
24 # include "config.h"
9874
90bc0cc4518f implement compiled dot and blkmm
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
25 #endif
90bc0cc4518f implement compiled dot and blkmm
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
26
22322
93b3cdd36854 move most f77 function decls to separate header files
John W. Eaton <jwe@octave.org>
parents: 22135
diff changeset
27 #include "lo-blas-proto.h"
9874
90bc0cc4518f implement compiled dot and blkmm
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
28 #include "mx-base.h"
26599
5ab12183280d dot.cc: Call Fsum directly rather than using feval.
Rik <rik@octave.org>
parents: 26493
diff changeset
29
5ab12183280d dot.cc: Call Fsum directly rather than using feval.
Rik <rik@octave.org>
parents: 26493
diff changeset
30 #include "builtin-defun-decls.h"
5ab12183280d dot.cc: Call Fsum directly rather than using feval.
Rik <rik@octave.org>
parents: 26493
diff changeset
31 #include "defun.h"
9874
90bc0cc4518f implement compiled dot and blkmm
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
32 #include "error.h"
90bc0cc4518f implement compiled dot and blkmm
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
33 #include "parse.h"
90bc0cc4518f implement compiled dot and blkmm
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
34
11586
12df7854fa7c strip trailing whitespace from source files
John W. Eaton <jwe@octave.org>
parents: 11553
diff changeset
35 static void
9874
90bc0cc4518f implement compiled dot and blkmm
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
36 get_red_dims (const dim_vector& x, const dim_vector& y, int dim,
22980
b4346e1b5b45 use F77_INT instead of octave_idx_type for libinterp dot function
John W. Eaton <jwe@octave.org>
parents: 22755
diff changeset
37 dim_vector& z, F77_INT& m, F77_INT& n, F77_INT& k)
9874
90bc0cc4518f implement compiled dot and blkmm
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
38 {
21660
53728df3e4c9 maint: for clarity, call ndims() rather than length() on dimension vectors.
Rik <rik@octave.org>
parents: 21301
diff changeset
39 int nd = x.ndims ();
53728df3e4c9 maint: for clarity, call ndims() rather than length() on dimension vectors.
Rik <rik@octave.org>
parents: 21301
diff changeset
40 assert (nd == y.ndims ());
9874
90bc0cc4518f implement compiled dot and blkmm
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
41 z = dim_vector::alloc (nd);
22980
b4346e1b5b45 use F77_INT instead of octave_idx_type for libinterp dot function
John W. Eaton <jwe@octave.org>
parents: 22755
diff changeset
42 octave_idx_type tmp_m = 1;
b4346e1b5b45 use F77_INT instead of octave_idx_type for libinterp dot function
John W. Eaton <jwe@octave.org>
parents: 22755
diff changeset
43 octave_idx_type tmp_n = 1;
b4346e1b5b45 use F77_INT instead of octave_idx_type for libinterp dot function
John W. Eaton <jwe@octave.org>
parents: 22755
diff changeset
44 octave_idx_type tmp_k = 1;
9874
90bc0cc4518f implement compiled dot and blkmm
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
45 for (int i = 0; i < nd; i++)
90bc0cc4518f implement compiled dot and blkmm
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
46 {
90bc0cc4518f implement compiled dot and blkmm
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
47 if (i < dim)
90bc0cc4518f implement compiled dot and blkmm
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
48 {
90bc0cc4518f implement compiled dot and blkmm
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
49 z(i) = x(i);
22980
b4346e1b5b45 use F77_INT instead of octave_idx_type for libinterp dot function
John W. Eaton <jwe@octave.org>
parents: 22755
diff changeset
50 tmp_m *= x(i);
9874
90bc0cc4518f implement compiled dot and blkmm
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
51 }
90bc0cc4518f implement compiled dot and blkmm
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
52 else if (i > dim)
90bc0cc4518f implement compiled dot and blkmm
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
53 {
90bc0cc4518f implement compiled dot and blkmm
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
54 z(i) = x(i);
22980
b4346e1b5b45 use F77_INT instead of octave_idx_type for libinterp dot function
John W. Eaton <jwe@octave.org>
parents: 22755
diff changeset
55 tmp_n *= x(i);
9874
90bc0cc4518f implement compiled dot and blkmm
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
56 }
90bc0cc4518f implement compiled dot and blkmm
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
57 else
90bc0cc4518f implement compiled dot and blkmm
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
58 {
26493
bc6237a189e1 dot.cc: Fix static analyzer detected issues (bug #55347).
Rik <rik@octave.org>
parents: 26376
diff changeset
59 z(i) = 1;
22980
b4346e1b5b45 use F77_INT instead of octave_idx_type for libinterp dot function
John W. Eaton <jwe@octave.org>
parents: 22755
diff changeset
60 tmp_k = x(i);
9874
90bc0cc4518f implement compiled dot and blkmm
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
61 }
90bc0cc4518f implement compiled dot and blkmm
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
62 }
22980
b4346e1b5b45 use F77_INT instead of octave_idx_type for libinterp dot function
John W. Eaton <jwe@octave.org>
parents: 22755
diff changeset
63
22988
cd33c785e80e put to_f77_int inside octave namespace
John W. Eaton <jwe@octave.org>
parents: 22980
diff changeset
64 m = octave::to_f77_int (tmp_m);
cd33c785e80e put to_f77_int inside octave namespace
John W. Eaton <jwe@octave.org>
parents: 22980
diff changeset
65 n = octave::to_f77_int (tmp_n);
cd33c785e80e put to_f77_int inside octave namespace
John W. Eaton <jwe@octave.org>
parents: 22980
diff changeset
66 k = octave::to_f77_int (tmp_k);
9874
90bc0cc4518f implement compiled dot and blkmm
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
67 }
90bc0cc4518f implement compiled dot and blkmm
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
68
15039
e753177cde93 maint: Move non-dynamically linked functions from DLD-FUNCTIONS/ to corefcn/ directory
Rik <rik@octave.org>
parents: 14501
diff changeset
69 DEFUN (dot, args, ,
21966
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21724
diff changeset
70 doc: /* -*- texinfo -*-
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21724
diff changeset
71 @deftypefn {} {} dot (@var{x}, @var{y}, @var{dim})
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21724
diff changeset
72 Compute the dot product of two vectors.
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21724
diff changeset
73
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21724
diff changeset
74 If @var{x} and @var{y} are matrices, calculate the dot products along the
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21724
diff changeset
75 first non-singleton dimension.
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21724
diff changeset
76
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21724
diff changeset
77 If the optional argument @var{dim} is given, calculate the dot products
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21724
diff changeset
78 along this dimension.
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21724
diff changeset
79
26599
5ab12183280d dot.cc: Call Fsum directly rather than using feval.
Rik <rik@octave.org>
parents: 26493
diff changeset
80 Implementation Note: This is equivalent to
5ab12183280d dot.cc: Call Fsum directly rather than using feval.
Rik <rik@octave.org>
parents: 26493
diff changeset
81 @code{sum (conj (@var{X}) .* @var{Y}, @var{dim})}, but avoids forming a
5ab12183280d dot.cc: Call Fsum directly rather than using feval.
Rik <rik@octave.org>
parents: 26493
diff changeset
82 temporary array and is faster. When @var{X} and @var{Y} are column vectors,
5ab12183280d dot.cc: Call Fsum directly rather than using feval.
Rik <rik@octave.org>
parents: 26493
diff changeset
83 the result is equivalent to @code{@var{X}' * @var{Y}}. Although, @code{dot}
5ab12183280d dot.cc: Call Fsum directly rather than using feval.
Rik <rik@octave.org>
parents: 26493
diff changeset
84 is defined for integer arrays, the output may differ from the expected result
5ab12183280d dot.cc: Call Fsum directly rather than using feval.
Rik <rik@octave.org>
parents: 26493
diff changeset
85 due to the limited range of integer objects.
21966
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21724
diff changeset
86 @seealso{cross, divergence}
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21724
diff changeset
87 @end deftypefn */)
9874
90bc0cc4518f implement compiled dot and blkmm
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
88 {
90bc0cc4518f implement compiled dot and blkmm
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
89 int nargin = args.length ();
90bc0cc4518f implement compiled dot and blkmm
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
90
90bc0cc4518f implement compiled dot and blkmm
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
91 if (nargin < 2 || nargin > 3)
20802
8bb38ba1bad6 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20556
diff changeset
92 print_usage ();
9874
90bc0cc4518f implement compiled dot and blkmm
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
93
20918
6f0bd96f93c0 maint: Use new C++ archetype in more files.
Rik <rik@octave.org>
parents: 20853
diff changeset
94 octave_value retval;
18100
6a71e5030df5 Follow coding convention of defining and initializing only 1 variable per line in liboctinterp.
Rik <rik@octave.org>
parents: 17787
diff changeset
95 octave_value argx = 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
96 octave_value argy = args(1);
9874
90bc0cc4518f implement compiled dot and blkmm
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
97
23586
f6c5db0a02e7 maint: Deprecate is_numeric_type and replace with isnumeric.
Rik <rik@octave.org>
parents: 23585
diff changeset
98 if (! argx.isnumeric () || ! argy.isnumeric ())
20918
6f0bd96f93c0 maint: Use new C++ archetype in more files.
Rik <rik@octave.org>
parents: 20853
diff changeset
99 error ("dot: X and Y must be numeric");
9874
90bc0cc4518f implement compiled dot and blkmm
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
100
20918
6f0bd96f93c0 maint: Use new C++ archetype in more files.
Rik <rik@octave.org>
parents: 20853
diff changeset
101 dim_vector dimx = argx.dims ();
6f0bd96f93c0 maint: Use new C++ archetype in more files.
Rik <rik@octave.org>
parents: 20853
diff changeset
102 dim_vector dimy = argy.dims ();
6f0bd96f93c0 maint: Use new C++ archetype in more files.
Rik <rik@octave.org>
parents: 20853
diff changeset
103 bool match = dimx == dimy;
23592
80e3bfb7bd5a maint: Deprecate is_vector and replace with isvector.
Rik <rik@octave.org>
parents: 23586
diff changeset
104 if (! match && nargin == 2 && dimx.isvector () && dimy.isvector ())
20918
6f0bd96f93c0 maint: Use new C++ archetype in more files.
Rik <rik@octave.org>
parents: 20853
diff changeset
105 {
6f0bd96f93c0 maint: Use new C++ archetype in more files.
Rik <rik@octave.org>
parents: 20853
diff changeset
106 // Change to column vectors.
6f0bd96f93c0 maint: Use new C++ archetype in more files.
Rik <rik@octave.org>
parents: 20853
diff changeset
107 dimx = dimx.redim (1);
6f0bd96f93c0 maint: Use new C++ archetype in more files.
Rik <rik@octave.org>
parents: 20853
diff changeset
108 argx = argx.reshape (dimx);
6f0bd96f93c0 maint: Use new C++ archetype in more files.
Rik <rik@octave.org>
parents: 20853
diff changeset
109 dimy = dimy.redim (1);
6f0bd96f93c0 maint: Use new C++ archetype in more files.
Rik <rik@octave.org>
parents: 20853
diff changeset
110 argy = argy.reshape (dimy);
6f0bd96f93c0 maint: Use new C++ archetype in more files.
Rik <rik@octave.org>
parents: 20853
diff changeset
111 match = dimx == dimy;
6f0bd96f93c0 maint: Use new C++ archetype in more files.
Rik <rik@octave.org>
parents: 20853
diff changeset
112 }
9874
90bc0cc4518f implement compiled dot and blkmm
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
113
20918
6f0bd96f93c0 maint: Use new C++ archetype in more files.
Rik <rik@octave.org>
parents: 20853
diff changeset
114 if (! match)
6f0bd96f93c0 maint: Use new C++ archetype in more files.
Rik <rik@octave.org>
parents: 20853
diff changeset
115 error ("dot: sizes of X and Y must match");
20556
4bed806ee3d4 eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents: 20218
diff changeset
116
20918
6f0bd96f93c0 maint: Use new C++ archetype in more files.
Rik <rik@octave.org>
parents: 20853
diff changeset
117 int dim;
6f0bd96f93c0 maint: Use new C++ archetype in more files.
Rik <rik@octave.org>
parents: 20853
diff changeset
118 if (nargin == 2)
6f0bd96f93c0 maint: Use new C++ archetype in more files.
Rik <rik@octave.org>
parents: 20853
diff changeset
119 dim = dimx.first_non_singleton ();
6f0bd96f93c0 maint: Use new C++ archetype in more files.
Rik <rik@octave.org>
parents: 20853
diff changeset
120 else
6f0bd96f93c0 maint: Use new C++ archetype in more files.
Rik <rik@octave.org>
parents: 20853
diff changeset
121 dim = args(2).int_value (true) - 1;
20556
4bed806ee3d4 eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents: 20218
diff changeset
122
20918
6f0bd96f93c0 maint: Use new C++ archetype in more files.
Rik <rik@octave.org>
parents: 20853
diff changeset
123 if (dim < 0)
6f0bd96f93c0 maint: Use new C++ archetype in more files.
Rik <rik@octave.org>
parents: 20853
diff changeset
124 error ("dot: DIM must be a valid dimension");
20556
4bed806ee3d4 eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents: 20218
diff changeset
125
22980
b4346e1b5b45 use F77_INT instead of octave_idx_type for libinterp dot function
John W. Eaton <jwe@octave.org>
parents: 22755
diff changeset
126 F77_INT m, n, k;
20918
6f0bd96f93c0 maint: Use new C++ archetype in more files.
Rik <rik@octave.org>
parents: 20853
diff changeset
127 dim_vector dimz;
23581
c3075ae020e1 maint: Deprecate is_complex_type and replace with iscomplex.
Rik <rik@octave.org>
parents: 23220
diff changeset
128 if (argx.iscomplex () || argy.iscomplex ())
20918
6f0bd96f93c0 maint: Use new C++ archetype in more files.
Rik <rik@octave.org>
parents: 20853
diff changeset
129 {
6f0bd96f93c0 maint: Use new C++ archetype in more files.
Rik <rik@octave.org>
parents: 20853
diff changeset
130 if (argx.is_single_type () || argy.is_single_type ())
6f0bd96f93c0 maint: Use new C++ archetype in more files.
Rik <rik@octave.org>
parents: 20853
diff changeset
131 {
6f0bd96f93c0 maint: Use new C++ archetype in more files.
Rik <rik@octave.org>
parents: 20853
diff changeset
132 FloatComplexNDArray x = argx.float_complex_array_value ();
6f0bd96f93c0 maint: Use new C++ archetype in more files.
Rik <rik@octave.org>
parents: 20853
diff changeset
133 FloatComplexNDArray y = argy.float_complex_array_value ();
6f0bd96f93c0 maint: Use new C++ archetype in more files.
Rik <rik@octave.org>
parents: 20853
diff changeset
134 get_red_dims (dimx, dimy, dim, dimz, m, n, k);
6f0bd96f93c0 maint: Use new C++ archetype in more files.
Rik <rik@octave.org>
parents: 20853
diff changeset
135 FloatComplexNDArray z (dimz);
20556
4bed806ee3d4 eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents: 20218
diff changeset
136
20918
6f0bd96f93c0 maint: Use new C++ archetype in more files.
Rik <rik@octave.org>
parents: 20853
diff changeset
137 F77_XFCN (cdotc3, CDOTC3, (m, n, k,
22135
407c66ae1e20 reduce warnings from GCC's link-time optimization feature (bug #48531)
John W. Eaton <jwe@octave.org>
parents: 22133
diff changeset
138 F77_CONST_CMPLX_ARG (x.data ()), F77_CONST_CMPLX_ARG (y.data ()),
407c66ae1e20 reduce warnings from GCC's link-time optimization feature (bug #48531)
John W. Eaton <jwe@octave.org>
parents: 22133
diff changeset
139 F77_CMPLX_ARG (z.fortran_vec ())));
20918
6f0bd96f93c0 maint: Use new C++ archetype in more files.
Rik <rik@octave.org>
parents: 20853
diff changeset
140 retval = z;
9874
90bc0cc4518f implement compiled dot and blkmm
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
141 }
90bc0cc4518f implement compiled dot and blkmm
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
142 else
20918
6f0bd96f93c0 maint: Use new C++ archetype in more files.
Rik <rik@octave.org>
parents: 20853
diff changeset
143 {
6f0bd96f93c0 maint: Use new C++ archetype in more files.
Rik <rik@octave.org>
parents: 20853
diff changeset
144 ComplexNDArray x = argx.complex_array_value ();
6f0bd96f93c0 maint: Use new C++ archetype in more files.
Rik <rik@octave.org>
parents: 20853
diff changeset
145 ComplexNDArray y = argy.complex_array_value ();
6f0bd96f93c0 maint: Use new C++ archetype in more files.
Rik <rik@octave.org>
parents: 20853
diff changeset
146 get_red_dims (dimx, dimy, dim, dimz, m, n, k);
6f0bd96f93c0 maint: Use new C++ archetype in more files.
Rik <rik@octave.org>
parents: 20853
diff changeset
147 ComplexNDArray z (dimz);
9874
90bc0cc4518f implement compiled dot and blkmm
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
148
20918
6f0bd96f93c0 maint: Use new C++ archetype in more files.
Rik <rik@octave.org>
parents: 20853
diff changeset
149 F77_XFCN (zdotc3, ZDOTC3, (m, n, k,
22135
407c66ae1e20 reduce warnings from GCC's link-time optimization feature (bug #48531)
John W. Eaton <jwe@octave.org>
parents: 22133
diff changeset
150 F77_CONST_DBLE_CMPLX_ARG (x.data ()), F77_CONST_DBLE_CMPLX_ARG (y.data ()),
407c66ae1e20 reduce warnings from GCC's link-time optimization feature (bug #48531)
John W. Eaton <jwe@octave.org>
parents: 22133
diff changeset
151 F77_DBLE_CMPLX_ARG (z.fortran_vec ())));
20918
6f0bd96f93c0 maint: Use new C++ archetype in more files.
Rik <rik@octave.org>
parents: 20853
diff changeset
152 retval = z;
6f0bd96f93c0 maint: Use new C++ archetype in more files.
Rik <rik@octave.org>
parents: 20853
diff changeset
153 }
6f0bd96f93c0 maint: Use new C++ archetype in more files.
Rik <rik@octave.org>
parents: 20853
diff changeset
154 }
23585
570170b6eb09 maint: Deprecate is_float_type and replace with isfloat.
Rik <rik@octave.org>
parents: 23581
diff changeset
155 else if (argx.isfloat () && argy.isfloat ())
20918
6f0bd96f93c0 maint: Use new C++ archetype in more files.
Rik <rik@octave.org>
parents: 20853
diff changeset
156 {
6f0bd96f93c0 maint: Use new C++ archetype in more files.
Rik <rik@octave.org>
parents: 20853
diff changeset
157 if (argx.is_single_type () || argy.is_single_type ())
6f0bd96f93c0 maint: Use new C++ archetype in more files.
Rik <rik@octave.org>
parents: 20853
diff changeset
158 {
6f0bd96f93c0 maint: Use new C++ archetype in more files.
Rik <rik@octave.org>
parents: 20853
diff changeset
159 FloatNDArray x = argx.float_array_value ();
6f0bd96f93c0 maint: Use new C++ archetype in more files.
Rik <rik@octave.org>
parents: 20853
diff changeset
160 FloatNDArray y = argy.float_array_value ();
6f0bd96f93c0 maint: Use new C++ archetype in more files.
Rik <rik@octave.org>
parents: 20853
diff changeset
161 get_red_dims (dimx, dimy, dim, dimz, m, n, k);
6f0bd96f93c0 maint: Use new C++ archetype in more files.
Rik <rik@octave.org>
parents: 20853
diff changeset
162 FloatNDArray z (dimz);
6f0bd96f93c0 maint: Use new C++ archetype in more files.
Rik <rik@octave.org>
parents: 20853
diff changeset
163
6f0bd96f93c0 maint: Use new C++ archetype in more files.
Rik <rik@octave.org>
parents: 20853
diff changeset
164 F77_XFCN (sdot3, SDOT3, (m, n, k, x.data (), y.data (),
6f0bd96f93c0 maint: Use new C++ archetype in more files.
Rik <rik@octave.org>
parents: 20853
diff changeset
165 z.fortran_vec ()));
6f0bd96f93c0 maint: Use new C++ archetype in more files.
Rik <rik@octave.org>
parents: 20853
diff changeset
166 retval = z;
6f0bd96f93c0 maint: Use new C++ archetype in more files.
Rik <rik@octave.org>
parents: 20853
diff changeset
167 }
6f0bd96f93c0 maint: Use new C++ archetype in more files.
Rik <rik@octave.org>
parents: 20853
diff changeset
168 else
6f0bd96f93c0 maint: Use new C++ archetype in more files.
Rik <rik@octave.org>
parents: 20853
diff changeset
169 {
6f0bd96f93c0 maint: Use new C++ archetype in more files.
Rik <rik@octave.org>
parents: 20853
diff changeset
170 NDArray x = argx.array_value ();
6f0bd96f93c0 maint: Use new C++ archetype in more files.
Rik <rik@octave.org>
parents: 20853
diff changeset
171 NDArray y = argy.array_value ();
6f0bd96f93c0 maint: Use new C++ archetype in more files.
Rik <rik@octave.org>
parents: 20853
diff changeset
172 get_red_dims (dimx, dimy, dim, dimz, m, n, k);
6f0bd96f93c0 maint: Use new C++ archetype in more files.
Rik <rik@octave.org>
parents: 20853
diff changeset
173 NDArray z (dimz);
6f0bd96f93c0 maint: Use new C++ archetype in more files.
Rik <rik@octave.org>
parents: 20853
diff changeset
174
6f0bd96f93c0 maint: Use new C++ archetype in more files.
Rik <rik@octave.org>
parents: 20853
diff changeset
175 F77_XFCN (ddot3, DDOT3, (m, n, k, x.data (), y.data (),
6f0bd96f93c0 maint: Use new C++ archetype in more files.
Rik <rik@octave.org>
parents: 20853
diff changeset
176 z.fortran_vec ()));
6f0bd96f93c0 maint: Use new C++ archetype in more files.
Rik <rik@octave.org>
parents: 20853
diff changeset
177 retval = z;
6f0bd96f93c0 maint: Use new C++ archetype in more files.
Rik <rik@octave.org>
parents: 20853
diff changeset
178 }
9874
90bc0cc4518f implement compiled dot and blkmm
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
179 }
90bc0cc4518f implement compiled dot and blkmm
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
180 else
20918
6f0bd96f93c0 maint: Use new C++ archetype in more files.
Rik <rik@octave.org>
parents: 20853
diff changeset
181 {
6f0bd96f93c0 maint: Use new C++ archetype in more files.
Rik <rik@octave.org>
parents: 20853
diff changeset
182 // Non-optimized evaluation.
26599
5ab12183280d dot.cc: Call Fsum directly rather than using feval.
Rik <rik@octave.org>
parents: 26493
diff changeset
183 // FIXME: This may *not* do what the user expects.
5ab12183280d dot.cc: Call Fsum directly rather than using feval.
Rik <rik@octave.org>
parents: 26493
diff changeset
184 // It might be more useful to issue a warning, or even an error, instead
5ab12183280d dot.cc: Call Fsum directly rather than using feval.
Rik <rik@octave.org>
parents: 26493
diff changeset
185 // of calculating possibly garbage results.
5ab12183280d dot.cc: Call Fsum directly rather than using feval.
Rik <rik@octave.org>
parents: 26493
diff changeset
186 // Think of the dot product of two int8 vectors where the multiplications
5ab12183280d dot.cc: Call Fsum directly rather than using feval.
Rik <rik@octave.org>
parents: 26493
diff changeset
187 // exceed intmax.
20918
6f0bd96f93c0 maint: Use new C++ archetype in more files.
Rik <rik@octave.org>
parents: 20853
diff changeset
188 octave_value_list tmp;
6f0bd96f93c0 maint: Use new C++ archetype in more files.
Rik <rik@octave.org>
parents: 20853
diff changeset
189 tmp(1) = dim + 1;
6f0bd96f93c0 maint: Use new C++ archetype in more files.
Rik <rik@octave.org>
parents: 20853
diff changeset
190 tmp(0) = do_binary_op (octave_value::op_el_mul, argx, argy);
6f0bd96f93c0 maint: Use new C++ archetype in more files.
Rik <rik@octave.org>
parents: 20853
diff changeset
191
26599
5ab12183280d dot.cc: Call Fsum directly rather than using feval.
Rik <rik@octave.org>
parents: 26493
diff changeset
192 tmp = Fsum (tmp, 1);
20918
6f0bd96f93c0 maint: Use new C++ archetype in more files.
Rik <rik@octave.org>
parents: 20853
diff changeset
193 if (! tmp.empty ())
6f0bd96f93c0 maint: Use new C++ archetype in more files.
Rik <rik@octave.org>
parents: 20853
diff changeset
194 retval = tmp(0);
6f0bd96f93c0 maint: Use new C++ archetype in more files.
Rik <rik@octave.org>
parents: 20853
diff changeset
195 }
9874
90bc0cc4518f implement compiled dot and blkmm
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
196
90bc0cc4518f implement compiled dot and blkmm
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
197 return retval;
90bc0cc4518f implement compiled dot and blkmm
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
198 }
90bc0cc4518f implement compiled dot and blkmm
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
199
90bc0cc4518f implement compiled dot and blkmm
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
200 /*
14501
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14360
diff changeset
201 %!assert (dot ([1, 2], [2, 3]), 8)
12788
9f4b48b93f6d codesprint: Write test for dot.cc
Jordi Gutiérrez Hermoso <jordigh@gmail.com>
parents: 12642
diff changeset
202
9f4b48b93f6d codesprint: Write test for dot.cc
Jordi Gutiérrez Hermoso <jordigh@gmail.com>
parents: 12642
diff changeset
203 %!test
9f4b48b93f6d codesprint: Write test for dot.cc
Jordi Gutiérrez Hermoso <jordigh@gmail.com>
parents: 12642
diff changeset
204 %! x = [2, 1; 2, 1];
9f4b48b93f6d codesprint: Write test for dot.cc
Jordi Gutiérrez Hermoso <jordigh@gmail.com>
parents: 12642
diff changeset
205 %! y = [-0.5, 2; 0.5, -2];
14501
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14360
diff changeset
206 %! assert (dot (x, y), [0 0]);
19141
25ab600d16fd codesprint: Add %!tests for dot.cc file.
Rik <rik@octave.org>
parents: 18671
diff changeset
207 %! assert (dot (single (x), single (y)), single ([0 0]));
12788
9f4b48b93f6d codesprint: Write test for dot.cc
Jordi Gutiérrez Hermoso <jordigh@gmail.com>
parents: 12642
diff changeset
208
9f4b48b93f6d codesprint: Write test for dot.cc
Jordi Gutiérrez Hermoso <jordigh@gmail.com>
parents: 12642
diff changeset
209 %!test
14501
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14360
diff changeset
210 %! x = [1+i, 3-i; 1-i, 3-i];
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14360
diff changeset
211 %! assert (dot (x, x), [4, 20]);
19141
25ab600d16fd codesprint: Add %!tests for dot.cc file.
Rik <rik@octave.org>
parents: 18671
diff changeset
212 %! assert (dot (single (x), single (x)), single ([4, 20]));
15239
a38d5ed5b3d8 dot.cc: Segfault with integers (bug #37199)
Max Brister <max@2bass.com>
parents: 15195
diff changeset
213
a38d5ed5b3d8 dot.cc: Segfault with integers (bug #37199)
Max Brister <max@2bass.com>
parents: 15195
diff changeset
214 %!test
26599
5ab12183280d dot.cc: Call Fsum directly rather than using feval.
Rik <rik@octave.org>
parents: 26493
diff changeset
215 %! x = int8 ([1, 2]);
5ab12183280d dot.cc: Call Fsum directly rather than using feval.
Rik <rik@octave.org>
parents: 26493
diff changeset
216 %! y = int8 ([2, 3]);
15239
a38d5ed5b3d8 dot.cc: Segfault with integers (bug #37199)
Max Brister <max@2bass.com>
parents: 15195
diff changeset
217 %! assert (dot (x, y), 8);
a38d5ed5b3d8 dot.cc: Segfault with integers (bug #37199)
Max Brister <max@2bass.com>
parents: 15195
diff changeset
218
a38d5ed5b3d8 dot.cc: Segfault with integers (bug #37199)
Max Brister <max@2bass.com>
parents: 15195
diff changeset
219 %!test
26599
5ab12183280d dot.cc: Call Fsum directly rather than using feval.
Rik <rik@octave.org>
parents: 26493
diff changeset
220 %! x = int8 ([1, 2; 3, 4]);
5ab12183280d dot.cc: Call Fsum directly rather than using feval.
Rik <rik@octave.org>
parents: 26493
diff changeset
221 %! y = int8 ([5, 6; 7, 8]);
15239
a38d5ed5b3d8 dot.cc: Segfault with integers (bug #37199)
Max Brister <max@2bass.com>
parents: 15195
diff changeset
222 %! assert (dot (x, y), [26 44]);
a38d5ed5b3d8 dot.cc: Segfault with integers (bug #37199)
Max Brister <max@2bass.com>
parents: 15195
diff changeset
223 %! assert (dot (x, y, 2), [17; 53]);
a38d5ed5b3d8 dot.cc: Segfault with integers (bug #37199)
Max Brister <max@2bass.com>
parents: 15195
diff changeset
224 %! assert (dot (x, y, 3), [5 12; 21 32]);
a38d5ed5b3d8 dot.cc: Segfault with integers (bug #37199)
Max Brister <max@2bass.com>
parents: 15195
diff changeset
225
26599
5ab12183280d dot.cc: Call Fsum directly rather than using feval.
Rik <rik@octave.org>
parents: 26493
diff changeset
226 ## This is, perhaps, surprising. Integer maximums and saturation mechanics
5ab12183280d dot.cc: Call Fsum directly rather than using feval.
Rik <rik@octave.org>
parents: 26493
diff changeset
227 ## prevent accurate value from being calculated.
5ab12183280d dot.cc: Call Fsum directly rather than using feval.
Rik <rik@octave.org>
parents: 26493
diff changeset
228 %!test
5ab12183280d dot.cc: Call Fsum directly rather than using feval.
Rik <rik@octave.org>
parents: 26493
diff changeset
229 %! x = int8 ([127]);
5ab12183280d dot.cc: Call Fsum directly rather than using feval.
Rik <rik@octave.org>
parents: 26493
diff changeset
230 %! assert (dot (x, x), 127);
5ab12183280d dot.cc: Call Fsum directly rather than using feval.
Rik <rik@octave.org>
parents: 26493
diff changeset
231
22737
7abc25e6206a maint: Clean up code base to follow Octave coding conventions.
Rik <rik@octave.org>
parents: 22323
diff changeset
232 ## Test input validation
18636
60562e5c8bfb Correctly validate arguments to dot function (bug #42061).
Rik <rik@octave.org>
parents: 17787
diff changeset
233 %!error dot ()
60562e5c8bfb Correctly validate arguments to dot function (bug #42061).
Rik <rik@octave.org>
parents: 17787
diff changeset
234 %!error dot (1)
60562e5c8bfb Correctly validate arguments to dot function (bug #42061).
Rik <rik@octave.org>
parents: 17787
diff changeset
235 %!error dot (1,2,3,4)
60562e5c8bfb Correctly validate arguments to dot function (bug #42061).
Rik <rik@octave.org>
parents: 17787
diff changeset
236 %!error <X and Y must be numeric> dot ({1,2}, [3,4])
60562e5c8bfb Correctly validate arguments to dot function (bug #42061).
Rik <rik@octave.org>
parents: 17787
diff changeset
237 %!error <X and Y must be numeric> dot ([1,2], {3,4})
60562e5c8bfb Correctly validate arguments to dot function (bug #42061).
Rik <rik@octave.org>
parents: 17787
diff changeset
238 %!error <sizes of X and Y must match> dot ([1 2], [1 2 3])
60562e5c8bfb Correctly validate arguments to dot function (bug #42061).
Rik <rik@octave.org>
parents: 17787
diff changeset
239 %!error <sizes of X and Y must match> dot ([1 2]', [1 2 3]')
60562e5c8bfb Correctly validate arguments to dot function (bug #42061).
Rik <rik@octave.org>
parents: 17787
diff changeset
240 %!error <sizes of X and Y must match> dot (ones (2,2), ones (2,3))
60562e5c8bfb Correctly validate arguments to dot function (bug #42061).
Rik <rik@octave.org>
parents: 17787
diff changeset
241 %!error <DIM must be a valid dimension> dot ([1 2], [1 2], 0)
9874
90bc0cc4518f implement compiled dot and blkmm
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
242 */
90bc0cc4518f implement compiled dot and blkmm
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
243
25567
8c0a35040974 Fix blkmm to work with empty matrices (bug #54261).
John W. Eaton <jwe@octave.org>
parents: 25054
diff changeset
244 template <typename T>
8c0a35040974 Fix blkmm to work with empty matrices (bug #54261).
John W. Eaton <jwe@octave.org>
parents: 25054
diff changeset
245 void
8c0a35040974 Fix blkmm to work with empty matrices (bug #54261).
John W. Eaton <jwe@octave.org>
parents: 25054
diff changeset
246 blkmm_internal (const T& x, const T& y, T& z,
8c0a35040974 Fix blkmm to work with empty matrices (bug #54261).
John W. Eaton <jwe@octave.org>
parents: 25054
diff changeset
247 F77_INT m, F77_INT n, F77_INT k, F77_INT np);
8c0a35040974 Fix blkmm to work with empty matrices (bug #54261).
John W. Eaton <jwe@octave.org>
parents: 25054
diff changeset
248
8c0a35040974 Fix blkmm to work with empty matrices (bug #54261).
John W. Eaton <jwe@octave.org>
parents: 25054
diff changeset
249 template <>
8c0a35040974 Fix blkmm to work with empty matrices (bug #54261).
John W. Eaton <jwe@octave.org>
parents: 25054
diff changeset
250 void
8c0a35040974 Fix blkmm to work with empty matrices (bug #54261).
John W. Eaton <jwe@octave.org>
parents: 25054
diff changeset
251 blkmm_internal (const FloatComplexNDArray& x, const FloatComplexNDArray& y,
8c0a35040974 Fix blkmm to work with empty matrices (bug #54261).
John W. Eaton <jwe@octave.org>
parents: 25054
diff changeset
252 FloatComplexNDArray& z,
8c0a35040974 Fix blkmm to work with empty matrices (bug #54261).
John W. Eaton <jwe@octave.org>
parents: 25054
diff changeset
253 F77_INT m, F77_INT n, F77_INT k, F77_INT np)
8c0a35040974 Fix blkmm to work with empty matrices (bug #54261).
John W. Eaton <jwe@octave.org>
parents: 25054
diff changeset
254 {
8c0a35040974 Fix blkmm to work with empty matrices (bug #54261).
John W. Eaton <jwe@octave.org>
parents: 25054
diff changeset
255 F77_XFCN (cmatm3, CMATM3, (m, n, k, np,
8c0a35040974 Fix blkmm to work with empty matrices (bug #54261).
John W. Eaton <jwe@octave.org>
parents: 25054
diff changeset
256 F77_CONST_CMPLX_ARG (x.data ()),
8c0a35040974 Fix blkmm to work with empty matrices (bug #54261).
John W. Eaton <jwe@octave.org>
parents: 25054
diff changeset
257 F77_CONST_CMPLX_ARG (y.data ()),
8c0a35040974 Fix blkmm to work with empty matrices (bug #54261).
John W. Eaton <jwe@octave.org>
parents: 25054
diff changeset
258 F77_CMPLX_ARG (z.fortran_vec ())));
8c0a35040974 Fix blkmm to work with empty matrices (bug #54261).
John W. Eaton <jwe@octave.org>
parents: 25054
diff changeset
259 }
8c0a35040974 Fix blkmm to work with empty matrices (bug #54261).
John W. Eaton <jwe@octave.org>
parents: 25054
diff changeset
260
8c0a35040974 Fix blkmm to work with empty matrices (bug #54261).
John W. Eaton <jwe@octave.org>
parents: 25054
diff changeset
261 template <>
8c0a35040974 Fix blkmm to work with empty matrices (bug #54261).
John W. Eaton <jwe@octave.org>
parents: 25054
diff changeset
262 void
8c0a35040974 Fix blkmm to work with empty matrices (bug #54261).
John W. Eaton <jwe@octave.org>
parents: 25054
diff changeset
263 blkmm_internal (const ComplexNDArray& x, const ComplexNDArray& y,
8c0a35040974 Fix blkmm to work with empty matrices (bug #54261).
John W. Eaton <jwe@octave.org>
parents: 25054
diff changeset
264 ComplexNDArray& z,
8c0a35040974 Fix blkmm to work with empty matrices (bug #54261).
John W. Eaton <jwe@octave.org>
parents: 25054
diff changeset
265 F77_INT m, F77_INT n, F77_INT k, F77_INT np)
8c0a35040974 Fix blkmm to work with empty matrices (bug #54261).
John W. Eaton <jwe@octave.org>
parents: 25054
diff changeset
266 {
8c0a35040974 Fix blkmm to work with empty matrices (bug #54261).
John W. Eaton <jwe@octave.org>
parents: 25054
diff changeset
267 F77_XFCN (zmatm3, ZMATM3, (m, n, k, np,
8c0a35040974 Fix blkmm to work with empty matrices (bug #54261).
John W. Eaton <jwe@octave.org>
parents: 25054
diff changeset
268 F77_CONST_DBLE_CMPLX_ARG (x.data ()),
8c0a35040974 Fix blkmm to work with empty matrices (bug #54261).
John W. Eaton <jwe@octave.org>
parents: 25054
diff changeset
269 F77_CONST_DBLE_CMPLX_ARG (y.data ()),
8c0a35040974 Fix blkmm to work with empty matrices (bug #54261).
John W. Eaton <jwe@octave.org>
parents: 25054
diff changeset
270 F77_DBLE_CMPLX_ARG (z.fortran_vec ())));
8c0a35040974 Fix blkmm to work with empty matrices (bug #54261).
John W. Eaton <jwe@octave.org>
parents: 25054
diff changeset
271 }
8c0a35040974 Fix blkmm to work with empty matrices (bug #54261).
John W. Eaton <jwe@octave.org>
parents: 25054
diff changeset
272
8c0a35040974 Fix blkmm to work with empty matrices (bug #54261).
John W. Eaton <jwe@octave.org>
parents: 25054
diff changeset
273 template <>
8c0a35040974 Fix blkmm to work with empty matrices (bug #54261).
John W. Eaton <jwe@octave.org>
parents: 25054
diff changeset
274 void
8c0a35040974 Fix blkmm to work with empty matrices (bug #54261).
John W. Eaton <jwe@octave.org>
parents: 25054
diff changeset
275 blkmm_internal (const FloatNDArray& x, const FloatNDArray& y, FloatNDArray& z,
8c0a35040974 Fix blkmm to work with empty matrices (bug #54261).
John W. Eaton <jwe@octave.org>
parents: 25054
diff changeset
276 F77_INT m, F77_INT n, F77_INT k, F77_INT np)
8c0a35040974 Fix blkmm to work with empty matrices (bug #54261).
John W. Eaton <jwe@octave.org>
parents: 25054
diff changeset
277 {
8c0a35040974 Fix blkmm to work with empty matrices (bug #54261).
John W. Eaton <jwe@octave.org>
parents: 25054
diff changeset
278 F77_XFCN (smatm3, SMATM3, (m, n, k, np,
8c0a35040974 Fix blkmm to work with empty matrices (bug #54261).
John W. Eaton <jwe@octave.org>
parents: 25054
diff changeset
279 x.data (), y.data (),
8c0a35040974 Fix blkmm to work with empty matrices (bug #54261).
John W. Eaton <jwe@octave.org>
parents: 25054
diff changeset
280 z.fortran_vec ()));
8c0a35040974 Fix blkmm to work with empty matrices (bug #54261).
John W. Eaton <jwe@octave.org>
parents: 25054
diff changeset
281 }
8c0a35040974 Fix blkmm to work with empty matrices (bug #54261).
John W. Eaton <jwe@octave.org>
parents: 25054
diff changeset
282
8c0a35040974 Fix blkmm to work with empty matrices (bug #54261).
John W. Eaton <jwe@octave.org>
parents: 25054
diff changeset
283 template <>
8c0a35040974 Fix blkmm to work with empty matrices (bug #54261).
John W. Eaton <jwe@octave.org>
parents: 25054
diff changeset
284 void
8c0a35040974 Fix blkmm to work with empty matrices (bug #54261).
John W. Eaton <jwe@octave.org>
parents: 25054
diff changeset
285 blkmm_internal (const NDArray& x, const NDArray& y, NDArray& z,
8c0a35040974 Fix blkmm to work with empty matrices (bug #54261).
John W. Eaton <jwe@octave.org>
parents: 25054
diff changeset
286 F77_INT m, F77_INT n, F77_INT k, F77_INT np)
8c0a35040974 Fix blkmm to work with empty matrices (bug #54261).
John W. Eaton <jwe@octave.org>
parents: 25054
diff changeset
287 {
8c0a35040974 Fix blkmm to work with empty matrices (bug #54261).
John W. Eaton <jwe@octave.org>
parents: 25054
diff changeset
288 F77_XFCN (dmatm3, DMATM3, (m, n, k, np,
8c0a35040974 Fix blkmm to work with empty matrices (bug #54261).
John W. Eaton <jwe@octave.org>
parents: 25054
diff changeset
289 x.data (), y.data (),
8c0a35040974 Fix blkmm to work with empty matrices (bug #54261).
John W. Eaton <jwe@octave.org>
parents: 25054
diff changeset
290 z.fortran_vec ()));
8c0a35040974 Fix blkmm to work with empty matrices (bug #54261).
John W. Eaton <jwe@octave.org>
parents: 25054
diff changeset
291 }
8c0a35040974 Fix blkmm to work with empty matrices (bug #54261).
John W. Eaton <jwe@octave.org>
parents: 25054
diff changeset
292
8c0a35040974 Fix blkmm to work with empty matrices (bug #54261).
John W. Eaton <jwe@octave.org>
parents: 25054
diff changeset
293 static void
8c0a35040974 Fix blkmm to work with empty matrices (bug #54261).
John W. Eaton <jwe@octave.org>
parents: 25054
diff changeset
294 get_blkmm_dims (const dim_vector& dimx, const dim_vector& dimy,
8c0a35040974 Fix blkmm to work with empty matrices (bug #54261).
John W. Eaton <jwe@octave.org>
parents: 25054
diff changeset
295 F77_INT& m, F77_INT& n, F77_INT& k, F77_INT& np,
8c0a35040974 Fix blkmm to work with empty matrices (bug #54261).
John W. Eaton <jwe@octave.org>
parents: 25054
diff changeset
296 dim_vector& dimz)
8c0a35040974 Fix blkmm to work with empty matrices (bug #54261).
John W. Eaton <jwe@octave.org>
parents: 25054
diff changeset
297 {
8c0a35040974 Fix blkmm to work with empty matrices (bug #54261).
John W. Eaton <jwe@octave.org>
parents: 25054
diff changeset
298 int nd = dimx.ndims ();
8c0a35040974 Fix blkmm to work with empty matrices (bug #54261).
John W. Eaton <jwe@octave.org>
parents: 25054
diff changeset
299
8c0a35040974 Fix blkmm to work with empty matrices (bug #54261).
John W. Eaton <jwe@octave.org>
parents: 25054
diff changeset
300 m = octave::to_f77_int (dimx(0));
8c0a35040974 Fix blkmm to work with empty matrices (bug #54261).
John W. Eaton <jwe@octave.org>
parents: 25054
diff changeset
301 k = octave::to_f77_int (dimx(1));
8c0a35040974 Fix blkmm to work with empty matrices (bug #54261).
John W. Eaton <jwe@octave.org>
parents: 25054
diff changeset
302 n = octave::to_f77_int (dimy(1));
8c0a35040974 Fix blkmm to work with empty matrices (bug #54261).
John W. Eaton <jwe@octave.org>
parents: 25054
diff changeset
303
8c0a35040974 Fix blkmm to work with empty matrices (bug #54261).
John W. Eaton <jwe@octave.org>
parents: 25054
diff changeset
304 octave_idx_type tmp_np = 1;
8c0a35040974 Fix blkmm to work with empty matrices (bug #54261).
John W. Eaton <jwe@octave.org>
parents: 25054
diff changeset
305
26493
bc6237a189e1 dot.cc: Fix static analyzer detected issues (bug #55347).
Rik <rik@octave.org>
parents: 26376
diff changeset
306 bool match = ((dimy(0) == k) && (nd == dimy.ndims ()));
25567
8c0a35040974 Fix blkmm to work with empty matrices (bug #54261).
John W. Eaton <jwe@octave.org>
parents: 25054
diff changeset
307
8c0a35040974 Fix blkmm to work with empty matrices (bug #54261).
John W. Eaton <jwe@octave.org>
parents: 25054
diff changeset
308 dimz = dim_vector::alloc (nd);
8c0a35040974 Fix blkmm to work with empty matrices (bug #54261).
John W. Eaton <jwe@octave.org>
parents: 25054
diff changeset
309
8c0a35040974 Fix blkmm to work with empty matrices (bug #54261).
John W. Eaton <jwe@octave.org>
parents: 25054
diff changeset
310 dimz(0) = m;
8c0a35040974 Fix blkmm to work with empty matrices (bug #54261).
John W. Eaton <jwe@octave.org>
parents: 25054
diff changeset
311 dimz(1) = n;
8c0a35040974 Fix blkmm to work with empty matrices (bug #54261).
John W. Eaton <jwe@octave.org>
parents: 25054
diff changeset
312 for (int i = 2; match && i < nd; i++)
8c0a35040974 Fix blkmm to work with empty matrices (bug #54261).
John W. Eaton <jwe@octave.org>
parents: 25054
diff changeset
313 {
26493
bc6237a189e1 dot.cc: Fix static analyzer detected issues (bug #55347).
Rik <rik@octave.org>
parents: 26376
diff changeset
314 match = (dimx(i) == dimy(i));
25567
8c0a35040974 Fix blkmm to work with empty matrices (bug #54261).
John W. Eaton <jwe@octave.org>
parents: 25054
diff changeset
315 dimz(i) = dimx(i);
8c0a35040974 Fix blkmm to work with empty matrices (bug #54261).
John W. Eaton <jwe@octave.org>
parents: 25054
diff changeset
316 tmp_np *= dimz(i);
8c0a35040974 Fix blkmm to work with empty matrices (bug #54261).
John W. Eaton <jwe@octave.org>
parents: 25054
diff changeset
317 }
8c0a35040974 Fix blkmm to work with empty matrices (bug #54261).
John W. Eaton <jwe@octave.org>
parents: 25054
diff changeset
318
8c0a35040974 Fix blkmm to work with empty matrices (bug #54261).
John W. Eaton <jwe@octave.org>
parents: 25054
diff changeset
319 np = octave::to_f77_int (tmp_np);
8c0a35040974 Fix blkmm to work with empty matrices (bug #54261).
John W. Eaton <jwe@octave.org>
parents: 25054
diff changeset
320
8c0a35040974 Fix blkmm to work with empty matrices (bug #54261).
John W. Eaton <jwe@octave.org>
parents: 25054
diff changeset
321 if (! match)
8c0a35040974 Fix blkmm to work with empty matrices (bug #54261).
John W. Eaton <jwe@octave.org>
parents: 25054
diff changeset
322 error ("blkmm: A and B dimensions don't match: (%s) and (%s)",
8c0a35040974 Fix blkmm to work with empty matrices (bug #54261).
John W. Eaton <jwe@octave.org>
parents: 25054
diff changeset
323 dimx.str ().c_str (), dimy.str ().c_str ());
8c0a35040974 Fix blkmm to work with empty matrices (bug #54261).
John W. Eaton <jwe@octave.org>
parents: 25054
diff changeset
324 }
8c0a35040974 Fix blkmm to work with empty matrices (bug #54261).
John W. Eaton <jwe@octave.org>
parents: 25054
diff changeset
325
8c0a35040974 Fix blkmm to work with empty matrices (bug #54261).
John W. Eaton <jwe@octave.org>
parents: 25054
diff changeset
326 template <typename T>
8c0a35040974 Fix blkmm to work with empty matrices (bug #54261).
John W. Eaton <jwe@octave.org>
parents: 25054
diff changeset
327 T
8c0a35040974 Fix blkmm to work with empty matrices (bug #54261).
John W. Eaton <jwe@octave.org>
parents: 25054
diff changeset
328 do_blkmm (const octave_value& xov, const octave_value& yov)
8c0a35040974 Fix blkmm to work with empty matrices (bug #54261).
John W. Eaton <jwe@octave.org>
parents: 25054
diff changeset
329 {
25606
959657cab846 maint: Strip trailing whitespace from source files.
John W. Eaton <jwe@octave.org>
parents: 25567
diff changeset
330 const T x = octave_value_extract<T> (xov);
959657cab846 maint: Strip trailing whitespace from source files.
John W. Eaton <jwe@octave.org>
parents: 25567
diff changeset
331 const T y = octave_value_extract<T> (yov);
25567
8c0a35040974 Fix blkmm to work with empty matrices (bug #54261).
John W. Eaton <jwe@octave.org>
parents: 25054
diff changeset
332 F77_INT m, n, k, np;
8c0a35040974 Fix blkmm to work with empty matrices (bug #54261).
John W. Eaton <jwe@octave.org>
parents: 25054
diff changeset
333 dim_vector dimz;
8c0a35040974 Fix blkmm to work with empty matrices (bug #54261).
John W. Eaton <jwe@octave.org>
parents: 25054
diff changeset
334
8c0a35040974 Fix blkmm to work with empty matrices (bug #54261).
John W. Eaton <jwe@octave.org>
parents: 25054
diff changeset
335 get_blkmm_dims (x.dims (), y.dims (), m, n, k, np, dimz);
8c0a35040974 Fix blkmm to work with empty matrices (bug #54261).
John W. Eaton <jwe@octave.org>
parents: 25054
diff changeset
336
8c0a35040974 Fix blkmm to work with empty matrices (bug #54261).
John W. Eaton <jwe@octave.org>
parents: 25054
diff changeset
337 T z (dimz);
8c0a35040974 Fix blkmm to work with empty matrices (bug #54261).
John W. Eaton <jwe@octave.org>
parents: 25054
diff changeset
338
8c0a35040974 Fix blkmm to work with empty matrices (bug #54261).
John W. Eaton <jwe@octave.org>
parents: 25054
diff changeset
339 if (n != 0 && m != 0)
8c0a35040974 Fix blkmm to work with empty matrices (bug #54261).
John W. Eaton <jwe@octave.org>
parents: 25054
diff changeset
340 blkmm_internal<T> (x, y, z, m, n, k, np);
8c0a35040974 Fix blkmm to work with empty matrices (bug #54261).
John W. Eaton <jwe@octave.org>
parents: 25054
diff changeset
341
8c0a35040974 Fix blkmm to work with empty matrices (bug #54261).
John W. Eaton <jwe@octave.org>
parents: 25054
diff changeset
342 return z;
8c0a35040974 Fix blkmm to work with empty matrices (bug #54261).
John W. Eaton <jwe@octave.org>
parents: 25054
diff changeset
343 }
8c0a35040974 Fix blkmm to work with empty matrices (bug #54261).
John W. Eaton <jwe@octave.org>
parents: 25054
diff changeset
344
15039
e753177cde93 maint: Move non-dynamically linked functions from DLD-FUNCTIONS/ to corefcn/ directory
Rik <rik@octave.org>
parents: 14501
diff changeset
345 DEFUN (blkmm, args, ,
21966
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21724
diff changeset
346 doc: /* -*- texinfo -*-
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21724
diff changeset
347 @deftypefn {} {} blkmm (@var{A}, @var{B})
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21724
diff changeset
348 Compute products of matrix blocks.
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21724
diff changeset
349
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21724
diff changeset
350 The blocks are given as 2-dimensional subarrays of the arrays @var{A},
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21724
diff changeset
351 @var{B}. The size of @var{A} must have the form @code{[m,k,@dots{}]} and
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21724
diff changeset
352 size of @var{B} must be @code{[k,n,@dots{}]}. The result is then of size
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21724
diff changeset
353 @code{[m,n,@dots{}]} and is computed as follows:
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21724
diff changeset
354
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21724
diff changeset
355 @example
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21724
diff changeset
356 @group
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21724
diff changeset
357 for i = 1:prod (size (@var{A})(3:end))
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21724
diff changeset
358 @var{C}(:,:,i) = @var{A}(:,:,i) * @var{B}(:,:,i)
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21724
diff changeset
359 endfor
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21724
diff changeset
360 @end group
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21724
diff changeset
361 @end example
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21724
diff changeset
362 @end deftypefn */)
9874
90bc0cc4518f implement compiled dot and blkmm
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
363 {
20819
f428cbe7576f eliminate unnecessary uses of nargin
John W. Eaton <jwe@octave.org>
parents: 20802
diff changeset
364 if (args.length () != 2)
20802
8bb38ba1bad6 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20556
diff changeset
365 print_usage ();
9874
90bc0cc4518f implement compiled dot and blkmm
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
366
20918
6f0bd96f93c0 maint: Use new C++ archetype in more files.
Rik <rik@octave.org>
parents: 20853
diff changeset
367 octave_value retval;
6f0bd96f93c0 maint: Use new C++ archetype in more files.
Rik <rik@octave.org>
parents: 20853
diff changeset
368
18100
6a71e5030df5 Follow coding convention of defining and initializing only 1 variable per line in liboctinterp.
Rik <rik@octave.org>
parents: 17787
diff changeset
369 octave_value argx = 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
370 octave_value argy = args(1);
9874
90bc0cc4518f implement compiled dot and blkmm
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
371
23586
f6c5db0a02e7 maint: Deprecate is_numeric_type and replace with isnumeric.
Rik <rik@octave.org>
parents: 23585
diff changeset
372 if (! argx.isnumeric () || ! argy.isnumeric ())
20918
6f0bd96f93c0 maint: Use new C++ archetype in more files.
Rik <rik@octave.org>
parents: 20853
diff changeset
373 error ("blkmm: A and B must be numeric");
20556
4bed806ee3d4 eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents: 20218
diff changeset
374
23581
c3075ae020e1 maint: Deprecate is_complex_type and replace with iscomplex.
Rik <rik@octave.org>
parents: 23220
diff changeset
375 if (argx.iscomplex () || argy.iscomplex ())
20918
6f0bd96f93c0 maint: Use new C++ archetype in more files.
Rik <rik@octave.org>
parents: 20853
diff changeset
376 {
6f0bd96f93c0 maint: Use new C++ archetype in more files.
Rik <rik@octave.org>
parents: 20853
diff changeset
377 if (argx.is_single_type () || argy.is_single_type ())
25567
8c0a35040974 Fix blkmm to work with empty matrices (bug #54261).
John W. Eaton <jwe@octave.org>
parents: 25054
diff changeset
378 retval = do_blkmm<FloatComplexNDArray> (argx, argy);
9874
90bc0cc4518f implement compiled dot and blkmm
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
379 else
25567
8c0a35040974 Fix blkmm to work with empty matrices (bug #54261).
John W. Eaton <jwe@octave.org>
parents: 25054
diff changeset
380 retval = do_blkmm<ComplexNDArray> (argx, argy);
9874
90bc0cc4518f implement compiled dot and blkmm
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
381 }
90bc0cc4518f implement compiled dot and blkmm
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
382 else
20918
6f0bd96f93c0 maint: Use new C++ archetype in more files.
Rik <rik@octave.org>
parents: 20853
diff changeset
383 {
6f0bd96f93c0 maint: Use new C++ archetype in more files.
Rik <rik@octave.org>
parents: 20853
diff changeset
384 if (argx.is_single_type () || argy.is_single_type ())
25567
8c0a35040974 Fix blkmm to work with empty matrices (bug #54261).
John W. Eaton <jwe@octave.org>
parents: 25054
diff changeset
385 retval = do_blkmm<FloatNDArray> (argx, argy);
20918
6f0bd96f93c0 maint: Use new C++ archetype in more files.
Rik <rik@octave.org>
parents: 20853
diff changeset
386 else
25567
8c0a35040974 Fix blkmm to work with empty matrices (bug #54261).
John W. Eaton <jwe@octave.org>
parents: 25054
diff changeset
387 retval = do_blkmm<NDArray> (argx, argy);
20918
6f0bd96f93c0 maint: Use new C++ archetype in more files.
Rik <rik@octave.org>
parents: 20853
diff changeset
388 }
9874
90bc0cc4518f implement compiled dot and blkmm
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
389
90bc0cc4518f implement compiled dot and blkmm
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
390 return retval;
90bc0cc4518f implement compiled dot and blkmm
Jaroslav Hajek <highegg@gmail.com>
parents:
diff changeset
391 }
12788
9f4b48b93f6d codesprint: Write test for dot.cc
Jordi Gutiérrez Hermoso <jordigh@gmail.com>
parents: 12642
diff changeset
392
9f4b48b93f6d codesprint: Write test for dot.cc
Jordi Gutiérrez Hermoso <jordigh@gmail.com>
parents: 12642
diff changeset
393 /*
9f4b48b93f6d codesprint: Write test for dot.cc
Jordi Gutiérrez Hermoso <jordigh@gmail.com>
parents: 12642
diff changeset
394 %!test
9f4b48b93f6d codesprint: Write test for dot.cc
Jordi Gutiérrez Hermoso <jordigh@gmail.com>
parents: 12642
diff changeset
395 %! x(:,:,1) = [1 2; 3 4];
9f4b48b93f6d codesprint: Write test for dot.cc
Jordi Gutiérrez Hermoso <jordigh@gmail.com>
parents: 12642
diff changeset
396 %! x(:,:,2) = [1 1; 1 1];
9f4b48b93f6d codesprint: Write test for dot.cc
Jordi Gutiérrez Hermoso <jordigh@gmail.com>
parents: 12642
diff changeset
397 %! z(:,:,1) = [7 10; 15 22];
9f4b48b93f6d codesprint: Write test for dot.cc
Jordi Gutiérrez Hermoso <jordigh@gmail.com>
parents: 12642
diff changeset
398 %! z(:,:,2) = [2 2; 2 2];
14501
60e5cf354d80 Update %!tests in DLD-FUNCTIONS/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14360
diff changeset
399 %! assert (blkmm (x,x), z);
19141
25ab600d16fd codesprint: Add %!tests for dot.cc file.
Rik <rik@octave.org>
parents: 18671
diff changeset
400 %! assert (blkmm (single (x), single (x)), single (z));
25ab600d16fd codesprint: Add %!tests for dot.cc file.
Rik <rik@octave.org>
parents: 18671
diff changeset
401 %! assert (blkmm (x, single (x)), single (z));
25ab600d16fd codesprint: Add %!tests for dot.cc file.
Rik <rik@octave.org>
parents: 18671
diff changeset
402
25ab600d16fd codesprint: Add %!tests for dot.cc file.
Rik <rik@octave.org>
parents: 18671
diff changeset
403 %!test
25ab600d16fd codesprint: Add %!tests for dot.cc file.
Rik <rik@octave.org>
parents: 18671
diff changeset
404 %! x(:,:,1) = [1 2; 3 4];
25ab600d16fd codesprint: Add %!tests for dot.cc file.
Rik <rik@octave.org>
parents: 18671
diff changeset
405 %! x(:,:,2) = [1i 1i; 1i 1i];
25ab600d16fd codesprint: Add %!tests for dot.cc file.
Rik <rik@octave.org>
parents: 18671
diff changeset
406 %! z(:,:,1) = [7 10; 15 22];
25ab600d16fd codesprint: Add %!tests for dot.cc file.
Rik <rik@octave.org>
parents: 18671
diff changeset
407 %! z(:,:,2) = [-2 -2; -2 -2];
25ab600d16fd codesprint: Add %!tests for dot.cc file.
Rik <rik@octave.org>
parents: 18671
diff changeset
408 %! assert (blkmm (x,x), z);
25ab600d16fd codesprint: Add %!tests for dot.cc file.
Rik <rik@octave.org>
parents: 18671
diff changeset
409 %! assert (blkmm (single (x), single (x)), single (z));
25ab600d16fd codesprint: Add %!tests for dot.cc file.
Rik <rik@octave.org>
parents: 18671
diff changeset
410 %! assert (blkmm (x, single (x)), single (z));
25ab600d16fd codesprint: Add %!tests for dot.cc file.
Rik <rik@octave.org>
parents: 18671
diff changeset
411
25567
8c0a35040974 Fix blkmm to work with empty matrices (bug #54261).
John W. Eaton <jwe@octave.org>
parents: 25054
diff changeset
412 %!test <*54261>
8c0a35040974 Fix blkmm to work with empty matrices (bug #54261).
John W. Eaton <jwe@octave.org>
parents: 25054
diff changeset
413 %! x = ones (0, 3, 3);
8c0a35040974 Fix blkmm to work with empty matrices (bug #54261).
John W. Eaton <jwe@octave.org>
parents: 25054
diff changeset
414 %! y = ones (3, 5, 3);
8c0a35040974 Fix blkmm to work with empty matrices (bug #54261).
John W. Eaton <jwe@octave.org>
parents: 25054
diff changeset
415 %! z = blkmm (x,y);
8c0a35040974 Fix blkmm to work with empty matrices (bug #54261).
John W. Eaton <jwe@octave.org>
parents: 25054
diff changeset
416 %! assert (size (z), [0, 5, 3]);
8c0a35040974 Fix blkmm to work with empty matrices (bug #54261).
John W. Eaton <jwe@octave.org>
parents: 25054
diff changeset
417 %! x = ones (1, 3, 3);
8c0a35040974 Fix blkmm to work with empty matrices (bug #54261).
John W. Eaton <jwe@octave.org>
parents: 25054
diff changeset
418 %! y = ones (3, 0, 3);
8c0a35040974 Fix blkmm to work with empty matrices (bug #54261).
John W. Eaton <jwe@octave.org>
parents: 25054
diff changeset
419 %! z = blkmm (x,y);
8c0a35040974 Fix blkmm to work with empty matrices (bug #54261).
John W. Eaton <jwe@octave.org>
parents: 25054
diff changeset
420 %! assert (size (z), [1, 0, 3]);
8c0a35040974 Fix blkmm to work with empty matrices (bug #54261).
John W. Eaton <jwe@octave.org>
parents: 25054
diff changeset
421
22737
7abc25e6206a maint: Clean up code base to follow Octave coding conventions.
Rik <rik@octave.org>
parents: 22323
diff changeset
422 ## Test input validation
19141
25ab600d16fd codesprint: Add %!tests for dot.cc file.
Rik <rik@octave.org>
parents: 18671
diff changeset
423 %!error blkmm ()
25ab600d16fd codesprint: Add %!tests for dot.cc file.
Rik <rik@octave.org>
parents: 18671
diff changeset
424 %!error blkmm (1)
25ab600d16fd codesprint: Add %!tests for dot.cc file.
Rik <rik@octave.org>
parents: 18671
diff changeset
425 %!error blkmm (1,2,3)
25ab600d16fd codesprint: Add %!tests for dot.cc file.
Rik <rik@octave.org>
parents: 18671
diff changeset
426 %!error <A and B must be numeric> blkmm ({1,2}, [3,4])
25ab600d16fd codesprint: Add %!tests for dot.cc file.
Rik <rik@octave.org>
parents: 18671
diff changeset
427 %!error <A and B must be numeric> blkmm ([3,4], {1,2})
25567
8c0a35040974 Fix blkmm to work with empty matrices (bug #54261).
John W. Eaton <jwe@octave.org>
parents: 25054
diff changeset
428 %!error <A and B dimensions don't match> blkmm (ones (2,2), ones (3,3))
12788
9f4b48b93f6d codesprint: Write test for dot.cc
Jordi Gutiérrez Hermoso <jordigh@gmail.com>
parents: 12642
diff changeset
429 */