sábado, noviembre 17, 2007

Viva vim (y erlang)

este post tiene doble intencion, primero, mostrar un poco de codigo de erlang que escribi, para que los que no lo conocen, lo conoscan. Segundo para demostrar la potencia de vim.

bueno, primero vamos con el codigo, que basicamente son dos modulos que escribi para multiplicacion de matrices de tamaño variable.

archivo row.erl (manejo de filas, creacion con un valor, creacion con valores aleatorios, multiplicacion de filas):



 1 -module(row).

 2 -export([new/2, new_random/3, multiply/2]).

 3

 4 new(Length, Value) -> new(Length, fun() -> Value end, []).

 5 new_random(Length, Start, Stop) -> 

 6     new(Length, fun() -> random:uniform() * (Stop - Start) + Start end, []).

 7

 8 new(0, _Fun, R) -> R;

 9 new(Length, Fun, R) -> new(Length - 1, Fun, [Fun()|R]).

10

11 multiply(R1, R2) -> multiply(R1, R2, 0).

12

13 multiply([], [], N) -> N;

14 multiply([R1H|R1T], [R2H|R2T], N) -> multiply(R1T, R2T, N + R1H * R2H).

15

Generated with VIM(http://www.vim.org, tip #1174)



archivo matrix.erl, maneja lo mismo que el anterior pero para matrices:



 1 -module(matrix).

 2 -export([new/3, new_random/4, head/1, tail/1, multiply/2]).

 3

 4 new(Rows, Cols, Val) -> 

 5     new(Rows, Cols, fun() -> row:new(Cols, Val) end, []).

 6

 7 new_random(Rows, Cols, Start, Stop) ->

 8     new(Rows, Cols, fun() -> row:new_random(Cols, Start, Stop) end, []).

 9

10 new(0, _Cols, _Fun, M) -> M;

11 new(Rows, Cols, Fun, M) -> new(Rows - 1, Cols, Fun, [Fun()|M]).

12

13 head(M) -> head(M, []).

14

15 head([], MH) -> lists:reverse(MH);

16 head([[H|_]|T], MH) -> head(T, [H|MH]).

17

18 tail(M) -> tail(M, []).

19

20 tail([], MT) -> lists:reverse(MT);

21 tail([[_|RT]|T], MT) -> tail(T, [RT|MT]).

22

23 multiply(A, B) -> multiply(A, B, []).

24

25 multiply([], _B, M) -> lists:reverse(M);

26 multiply([AH|AT], B, M) -> multiply(AT, B, [multiply_row(AH, B)|M]).

27

28 multiply_row(R, M) -> multiply_row(R, M, []).

29

30 multiply_row(_R, [[]|_], N) -> lists:reverse(N);

31 multiply_row(R, M, N) -> 

32     multiply_row(R, tail(M), [row:multiply(R, head(M))|N]).

33

Generated with VIM(http://www.vim.org, tip #1174)


como hacerlo esta descripto en la firma del codigo, basicamente pegar el codigo que aparece ahi en tu ~/.vimrc, abri el archivo que queres, entras en modo visual, seleccionas la parte que te interesa y apretas :MyToHtml, y te genera el html.

voy a ver si arreglo el css del blog para que las lineas no salgan tan separadas

un codigo de ejemplo para esa lib:

3> row:new(5,0). % crea una fila con 5 elementos seteados en 0
[0,0,0,0,0]

5> R1 = row:new_random(5,1,5). % crea una fila con 5 elementos random entre 1 y 5
[2.90848,3.66783,4.66262,3.38979,2.24531]

6> R2 = row:new_random(5,1,5). % crea una fila con 5 elementos random entre 1 y 5
[1.63925,3.78856,1.83779,1.56843,3.38604]

7> row:multiply(R1, R2). % multiplica R1 y R2
40.1518

8> M1 = matrix:new_random(4,3,1,5). % crea una matrix de 4x3 con valores entre 1 y 5
[[4.95718,3.31525,1.23460],
[2.23877,2.60385,2.90309],
[3.24848,1.02369,2.68560],
[2.83170,1.85989,3.23302]]

10> M3 = matrix:new_random(3,2,1,5). % crea una matrix de 4x3 con valores entre 1 y 5
[[2.55555,3.43706],[3.24636,4.95171],[1.21720,1.19310]]

11> matrix:multiply(M1, M3). % las multiplica
[[24.9336,34.9273],[17.7079,24.0519],[14.8938,19.4384],[17.2097,22.7997]]

1 comentario:

NacheN dijo...

muy util el codigo, aunque seria muy interesante que me ayudes a codificar en erlang un programita que reciba como parametro la cantidad de tareas y que realice la multiplicacion de matrices utilizando esa cantidad de tareas, desde ya muchas gracias.

Seguidores

Archivo del Blog