Browse thread
[Caml-list] laconical input from a file for arrays and/or matrices
-
Khamenia, Valery
- samsaga2
- Richard Jones
- Issac Trotts
[
Home
]
[ Index:
by date
|
by threads
]
[ Message by date: previous | next ] [ Message in thread: previous | next ] [ Thread: previous | next ]
[ Message by date: previous | next ] [ Message in thread: previous | next ] [ Thread: previous | next ]
| Date: | -- (:) |
| From: | Issac Trotts <ijtrotts@u...> |
| Subject: | Re: [Caml-list] laconical input from a file for arrays and/or matrices |
On Mon, Feb 02, 2004 at 11:42:18AM +0100, Khamenia, Valery wrote:
> Hi OCaMLers,
>
> here goes my usual way to input ASCII matrices from file in C++:
>
> // ------- start of fragment -----------
> #include <iostream>
> #include <vector>
> using namespace std;
>
> void input_matrix(vector<vector<double > >&vec) {
> int m, n;
> cin >> m;
> cin >> n;
> vec.resize (m);
> for( int i = 0; i<m; i++)
> vec[i].resize(n);
> for( int i = 0; i<m; i++)
> for( int j = 0; j<n; j++)
> cin >> vec[i][j];
> }
> // -------- end of fragment -------------
>
> then for matrix :
>
> 3
> 3
> 1 2 3
> 4 5 6
> 7 8 9
>
> stored in ASCII text file mymatrix.dat
>
> i just run my program:
>
> % myprogram < mymatrix.dat
>
> and it is done.
>
> Thus, the few lines of code and i can apply all math I need.
Here's a way to do it with camlp4. You get OCaml-style comments
for free from Genlex this way:
#load "camlp4o.cma";;
open Genlex;;
let input_matrix channel =
let read_number = parser
[< 'Int i >] -> float i
| [< 'Float f >] -> f in
let rec read_nums n =
if n = 0
then parser [< >] -> []
else parser [< head=read_number; tail=read_nums (n-1) >] -> head::tail in
let rec read_matrix_data m n =
if m = 0
then parser [< >] -> []
else parser
[< row = read_nums n; rest = read_matrix_data (m-1) n >] ->
(Array.of_list row) :: rest in
let read_matrix = parser
[< 'Int m; 'Int n; rest >] ->
let rows = read_matrix_data m n rest in
Array.of_list rows in
let charstream = Stream.of_channel channel in
let lexer = Genlex.make_lexer [] charstream in
read_matrix lexer;;
input_matrix stdin;;
--
Issac Trotts
http://redwood.ucdavis.edu/~issac
-------------------
To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr
Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners