[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.ruby

storing and manipulating columns of data

baptiste Auguié

6/30/2007 10:38:00 AM

Hi,

Being used to deal with Octave / Matlab, I'm a bit confused by Ruby
structures (arrays, hashes, etc). I have this data file "data.dat"
with 3 columns:


> 1.240000 9.990000e-01 1.290000e-06
> 1.550000 1.000000e+00 2.920000e-06
> 2.066000 1.002000e+00 8.360000e-06
> 2.480000 1.001000e+00 1.520000e-05
> 2.755000 1.001000e+00 2.210000e-05
> 3.099000 1.003000e+00 3.570000e-05
> 3.444000 1.003000e+00 3.240000e-05
> 3.542000 1.003000e+00 1.720000e-05
> 4.133000 1.001000e+00 1.430000e-05
> 4.959000 1.001000e+00 2.400000e-05
> 6.199000 1.001000e+00 4.720000e-05
> 8.265000 9.990000e-01 1.210000e-04

I would like to think of the columns as arrays "a", "b", "c", execute
a loop along their indices, pick the values i want, and do something
with them. What would be a sensible data structure for this?
I can read this datafile line by line using IO:readlines("data.dat"),
but I cannot find a way to refer to one column in the array of
strings generated.


Best regards,

baptiste


4 Answers

Alex Young

6/30/2007 10:51:00 AM

0

baptiste Auguié wrote:
> Hi,
>
> Being used to deal with Octave / Matlab, I'm a bit confused by Ruby
> structures (arrays, hashes, etc). I have this data file "data.dat" with
> 3 columns:
>
>
>> 1.240000 9.990000e-01 1.290000e-06
>> 1.550000 1.000000e+00 2.920000e-06
>> 2.066000 1.002000e+00 8.360000e-06
>> 2.480000 1.001000e+00 1.520000e-05
>> 2.755000 1.001000e+00 2.210000e-05
>> 3.099000 1.003000e+00 3.570000e-05
>> 3.444000 1.003000e+00 3.240000e-05
>> 3.542000 1.003000e+00 1.720000e-05
>> 4.133000 1.001000e+00 1.430000e-05
>> 4.959000 1.001000e+00 2.400000e-05
>> 6.199000 1.001000e+00 4.720000e-05
>> 8.265000 9.990000e-01 1.210000e-04
>
> I would like to think of the columns as arrays "a", "b", "c", execute a
> loop along their indices, pick the values i want, and do something with
> them. What would be a sensible data structure for this?
> I can read this datafile line by line using IO:readlines("data.dat"),
> but I cannot find a way to refer to one column in the array of strings
> generated.
In native Ruby, the only way to do that would be:

arr = [[0,1],[2,3],[4,5]]
arr.map{|a| a[0]}
# => [0,2,4]

If you can install rb-gsl (and it's probably a good idea if you're
expecting to do matlab/octavey things), then there's the
GSL::Matrix#column method which (as I understand it, not being a heavy
GSL user) actually gives a reference into the original matrix, rather
than copying to a new one as Array#map does.

--
Alex

Tim Hunter

6/30/2007 12:00:00 PM

0

baptiste Auguié wrote:
> Hi,
>
> Being used to deal with Octave / Matlab, I'm a bit confused by Ruby
> structures (arrays, hashes, etc). I have this data file "data.dat"
> with 3 columns:
>
> I would like to think of the columns as arrays "a", "b", "c", execute
> a loop along their indices, pick the values i want, and do something
> with them. What would be a sensible data structure for this?
> I can read this datafile line by line using IO:readlines("data.dat"),
> but I cannot find a way to refer to one column in the array of strings
> generated.
>
You can use String#split to split each line into an array of 3 numbers.
If you want to use the array values as numbers, you'll need to use
String#to_f as well to convert the strings to numeric values.

ri String#split
ri String#to_f

--
RMagick OS X Installer [http://rubyforge.org/project...]
RMagick Hints & Tips [http://rubyforge.org/forum/forum.php?for...]
RMagick Installation FAQ [http://rmagick.rubyforge.org/instal...]


Morton Goldberg

6/30/2007 12:03:00 PM

0

On Jun 30, 2007, at 6:37 AM, baptiste Auguié wrote:

> Being used to deal with Octave / Matlab, I'm a bit confused by Ruby
> structures (arrays, hashes, etc). I have this data file "data.dat"
> with 3 columns:
>
>
>> 1.240000 9.990000e-01 1.290000e-06
>> 1.550000 1.000000e+00 2.920000e-06
>> 2.066000 1.002000e+00 8.360000e-06
>> 2.480000 1.001000e+00 1.520000e-05
>> 2.755000 1.001000e+00 2.210000e-05
>> 3.099000 1.003000e+00 3.570000e-05
>> 3.444000 1.003000e+00 3.240000e-05
>> 3.542000 1.003000e+00 1.720000e-05
>> 4.133000 1.001000e+00 1.430000e-05
>> 4.959000 1.001000e+00 2.400000e-05
>> 6.199000 1.001000e+00 4.720000e-05
>> 8.265000 9.990000e-01 1.210000e-04
>
> I would like to think of the columns as arrays "a", "b", "c",
> execute a loop along their indices, pick the values i want, and do
> something with them. What would be a sensible data structure for this?
> I can read this datafile line by line using IO:readlines
> ("data.dat"), but I cannot find a way to refer to one column in the
> array of strings generated.

Maybe something like this is what you're looking for:

<code>
data = DATA.readlines
rows = data.map do |row|
row.split(/\s+/).map { |elt| elt.to_f }
end
a, b, c = rows.transpose
p a, b, c
__END__
1.240000 9.990000e-01 1.290000e-06
1.550000 1.000000e+00 2.920000e-06
2.066000 1.002000e+00 8.360000e-06
2.480000 1.001000e+00 1.520000e-05
</code>

<result>
[1.24, 1.55, 2.066, 2.48]
[0.999, 1.0, 1.002, 1.001]
[1.29e-06, 2.92e-06, 8.36e-06, 1.52e-05]
</result>


Regards, Morton



Axel Etzold

6/30/2007 12:42:00 PM

0

Dear Baptiste,

I'd also recommend rb-gsl, but if you have trouble
installing from source, you can also use the Matrix
class from Ruby:

http://www.ruby-doc.org/stdlib/libdoc/matrix/rdoc/classes/M...


require "matrix"

a=Matrix.columns([[25, 93], [-1, 66]])
=> 25 -1
93 66

a.transpose
=> 25 93
-1 66

Best regards,

Axel
--
Ist Ihr Browser Vista-kompatibel? Jetzt die neuesten
Browser-Versionen downloaden: http://www.gmx.net/de/...