[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: Q: Low hanging fruit?
From: |
Jaroslav Hajek |
Subject: |
Re: Q: Low hanging fruit? |
Date: |
Tue, 11 Mar 2008 18:29:36 +0100 |
On Tue, Mar 11, 2008 at 5:40 PM, David Bateman
<address@hidden> wrote:
> Jaroslav Hajek wrote:
> > On Tue, Mar 11, 2008 at 3:10 PM, David Bateman
> > <address@hidden> wrote:
> >
> >> Jaroslav Hajek wrote:
> >> > I've already started working on dlmread/dlmwrite. The thing is that
> >> > octave-forge's
> >> > dlmread is not quite like Matlab's - it cannot handle the range
> >> > specification in spreadsheet format (like "A1..B10")
> >> I've added this behavior. See the attached version.
> >>
> >>
> >
> > OK.
> >
> > Just for fun, I ended up with this (untested):
> >
> > static bool
> > read_cell_spec(std::istream& is,
> > octave_idx_type& row, octave_idx_type& col)
> > {
> > bool stat;
> > octave_idx_type c;
> > if (is && isalpha (is.peek ()))
> > {
> > col = toupper (is.get ()) - 'A';
> > if (isalpha (is.peek ()))
> > col = 26*(col + 1) + toupper(is.get ()) - 'A';
> > is >> row;
> > }
> > return is && is.eof () || (c = is.get (), c == '.'
> > && is.get () == '.' || c == ':');
> > }
> >
> The above doesn't allow lower case in the spreadsheet indexing.. You
> have to check whether is.get() returns a lower case value.
I hope its the toupper() that takes care of that ...
> Also I
> believe we'll have to initialize row/col somewhere (though maybe not in
> this function) to allow your ":B10" syntax to work..
Definitely. Either it's somewhere else, or I've just forgotten it. I'm
not sure whether I've already tested this. I'm on a different computer
now, so can't check at this moment.
>
> > static bool
> > parse_range_spec(const octave_value& range_spec,
> > octave_idx_type& rlo, octave_idx_type& clo,
> > octave_idx_type& rup, octave_idx_type& cup)
> > {
> > if (range_spec.is_real_matrix () && range_spec.numel () == 4)
> > {
> > Matrix m = range_spec.matrix_value ();
> > rlo = m(0); clo = m(1);
> > rup = m(2); cup = m(3);
> > return true;
> > }
> > else if (range_spec.is_string ())
> > {
> > std::istringstream sps (spstr);
> >
> > return read_cell_spec (sps, rlo, clo) && read_cell_spec (sps, rup,
> cup);
> > }
> > else
> > return false;
> > }
> >
> >
> > so that you can specify "A1..B10", "A1:B10", ":B10", "A1:" or "A1.."
> >
> cool... I assumed that ".." and not ":" is used and that both leading
> and trailing indices must be defined.. I think the above will nee da bit
> of work to get it right, but its certainly more robust than what I
> suggested. I'll adapt my code.
>
>
> > <text about the matlab complex dlmread mess cut>
>
> >
> > OK, I don't think this has to be pushed too far. There are more ways
> > how to write a complex number (thinking of the Fortran (a,b) style),
> > and there's no need for dlmread to be too smart, I think that
> > basically it's enough if it can read whatever written with dlmwrite or
> > save.
> >
> The octave-forge function can even read the fortran style as well as
> long as the separation character is not "(", ")" or ","... I agree we
> shouldn't push this too far, and I'm happy enough with how it stand.
> That is complex number should be written like "-1.52+2.56i" with no
> whitespace characters...
>
>
> >> > Moreover, I'd like dlmread to start with Matrix and allocate a
> >> > ComplexMatrix only if it
> >> > actually encounters a complex number (real numbers are much more
> >> > common IMHO, that's why I suppose this optimization is worth it).
> >> >
> >> Ok, added that as well, together with some test code for the function.
> >>
> >>
> >
> > Cool. It seems I can give up with my work on this.
> > But one more suggestion:
> > It seems that your version reads more than is needed and then strip the
> result.
> > I would consider it more sound not to grow the matrix more than
> > needed, at least row-wise,
> > as there may be much more data in the file than actually needed. If
> > always the whole file was read and then the result stripped, the range
> > parameter would actually be unnecessary as you can achieve the same by
> > slicing after the reading.
> >
> Ok, agreed for the rows, I'll look at it..
>
> D.
>
>
>
>
> > cheers,
> >
> >
> >
> >
>
>
> --
>
> David Bateman address@hidden
>
>
> Motorola Labs - Paris +33 1 69 35 48 04 (Ph)
> Parc Les Algorithmes, Commune de St Aubin +33 6 72 01 06 33 (Mob)
> 91193 Gif-Sur-Yvette FRANCE +33 1 69 35 77 01 (Fax)
>
> The information contained in this communication has been classified as:
>
> [x] General Business Information
> [ ] Motorola Internal Use Only
> [ ] Motorola Confidential Proprietary
>
>
--
RNDr. Jaroslav Hajek
computing expert
Aeronautical Research and Test Institute (VZLU)
Prague, Czech Republic
url: www.highegg.matfyz.cz
- Q: Low hanging fruit?, (continued)
- Re: Q: Low hanging fruit?, John W. Eaton, 2008/03/11
- Re: Q: Low hanging fruit?, David Bateman, 2008/03/11
- Re: Q: Low hanging fruit?, David Bateman, 2008/03/11
- Re: Q: Low hanging fruit?, John W. Eaton, 2008/03/11
- Re: Q: Low hanging fruit?, David Bateman, 2008/03/12
- Re: Q: Low hanging fruit?, David Bateman, 2008/03/12
- Re: Q: Low hanging fruit?, John W. Eaton, 2008/03/12
Re: Q: Low hanging fruit?, Bill Denney, 2008/03/16