# HG changeset patch # User jwe # Date 745633749 0 # Node ID 2876864f1fdb65c29cb4f9fbf8f4240e843041a3 # Parent 74d6f5fe70a1a311a12d38e0df537db8bd0c527c [project @ 1993-08-18 00:29:09 by jwe] (do_scalar_index): Handle two vector args of all ones. diff -r 74d6f5fe70a1 -r 2876864f1fdb src/tc-index.cc --- a/src/tc-index.cc Tue Aug 17 06:26:04 1993 +0000 +++ b/src/tc-index.cc Wed Aug 18 00:29:09 1993 +0000 @@ -58,48 +58,83 @@ else panic_impossible (); } - else if (nargs != 2) - { - error ("illegal number of arguments for scalar type"); - jump_to_top_level (); - } - else if (args[1].is_matrix_type ()) + else { - Matrix mi = args[1].matrix_value (); + int rows = 0; + int cols = 0; - idx_vector i (mi, user_pref.do_fortran_indexing, ""); - - int len = i.length (); - if (len == i.ones_count ()) + switch (nargs) { - if (type_tag == scalar_constant) - { - if (user_pref.prefer_column_vectors) - { - Matrix m (len, 1, scalar); - return tree_constant (m); - } - else - { - Matrix m (1, len, scalar); - return tree_constant (m); - } - } - else if (type_tag == complex_scalar_constant) - { - if (user_pref.prefer_column_vectors) - { - ComplexMatrix m (len, 1, *complex_scalar); - return tree_constant (m); - } - else - { - ComplexMatrix m (1, len, *complex_scalar); - return tree_constant (m); - } - } - else - panic_impossible (); + case 3: + { + if (args[2].is_matrix_type ()) + { + Matrix mj = args[2].matrix_value (); + + idx_vector j (mj, user_pref.do_fortran_indexing, ""); + + int len = j.length (); + if (len == j.ones_count ()) + cols = len; + } + else if (args[2].is_scalar_type () + && NINT (args[2].double_value ()) == 1) + { + cols = 1; + } + else + break; + } +// Fall through... + case 2: + { + if (args[1].is_matrix_type ()) + { + Matrix mi = args[1].matrix_value (); + + idx_vector i (mi, user_pref.do_fortran_indexing, ""); + + int len = i.length (); + if (len == i.ones_count ()) + rows = len; + } + else if (args[1].is_scalar_type () + && NINT (args[1].double_value ()) == 1) + { + rows = 1; + } + else + break; + + if (cols == 0) + { + if (user_pref.prefer_column_vectors) + cols = 1; + else + { + cols = rows; + rows = 1; + } + } + + if (type_tag == scalar_constant) + { + Matrix m (rows, cols, scalar); + return tree_constant (m); + } + else if (type_tag == complex_scalar_constant) + { + ComplexMatrix cm (rows, cols, *complex_scalar); + return tree_constant (cm); + } + else + panic_impossible (); + } + break; + default: + error ("illegal number of arguments for scalar type"); + jump_to_top_level (); + break; } }