Форум программистов, компьютерный форум, киберфорум
F# .NET
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
1 / 1 / 2
Регистрация: 20.10.2011
Сообщений: 142
1

Переписать код на F#, Haskel или Erlang с использованием возможностей распараллеливания языка

25.12.2013, 15:52. Просмотров 888. Ответов 6
Метки нет (Все метки)

Есть алгоритм на C#/C++/Java (кому что по душе) поиска наибольшего и наименьшего собственного числа в матрице (50х50 для теста). Нужно переписать этот код на F#, Haskel или Erlang с использованием возможностей распараллеливания языка (хоть самое херовое, тупо один цикл распараллелить и все).
Сможет кто-нибудь сделать? За деньги, естественно. Горит сдача работы =(

Добавлено через 6 минут
Вот код java
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
import java.io.*;
import java.util.*;
 
public class Main {
 
    private static double eps = 0.0001;
 
    public static void main(String[] args) throws IOException {
        Scanner scanner = new Scanner(new FileReader(new File("input.txt")));
        int n = scanner.nextInt();
        eps = scanner.nextDouble();
        double a[][] = new double[n][n];
        double x[] = new double[n];
        for (int i = 0; i < n; i++)
            x[i] = scanner.nextDouble();
 
        for (int i = 0; i < n; i++) 
            for (int j = 0; j < n; j++)
                a[i][j] = scanner.nextDouble();
        
        double l1[] = new double[n];
        double lambda1 = calcProperNumber1(a, x, l1);
        System.out.format("First lambda: %5.5f\nVector:\n", lambda1);
        print(l1);
 
        double l2[] = new double[n];
        double lambda2 = calcProperNumber2(a, x, lambda1, l1, l2);
        System.out.format("\nSecond lambda: %5.5f\nVector:\n", lambda2);
        print(l2);
    }
 
    public static double calcProperNumber1(double[][] a, double[] x, double[] l) {
        double xk[] = new double[x.length];
        double currentLambda, lastLambda = 0.0d;
 
        while (true) {
            Arrays.fill(xk, 0);
            for (int i = 0; i < a.length; i++)
                for (int j = 0; j < x.length; j++)
                    xk[i] += a[i][j] * x[j];
 
            currentLambda = dotProduct(xk, x) / dotProduct(x, x);
 
            double norma = norma(xk);
            for (int i = 0; i < xk.length; i++)
                xk[i] /= norma;
 
            if (Math.abs(currentLambda - lastLambda) < eps
                    && lastLambda != 0.0d)
                break;
 
            lastLambda = currentLambda;
            x = xk.clone();
        }
        for (int i = 0; i < xk.length; i++)
            l[i] = xk[i];
 
        return currentLambda;
    }
 
    private static double calcProperNumber2(double[][] a, double[] x,
            double lambda1, double[] l1, double[] l2) {
        double at[][] = new double[a.length][a.length];
        double xk[] = new double[x.length];
        double e1[] = new double[x.length];
        double g1[] = new double[x.length];
        double k = 0.0d;
        double currentLambda, lastLambda = 0.0d;
 
        for (int i = 0; i < a.length; i++)
            for (int j = 0; j < a.length; j++)
                at[i][j] = a[j][i];
        e1 = l1;
        calcProperNumber1(at, x, g1);
 
        k = dotProduct(x, g1) / dotProduct(e1, g1);
 
        for (int i = 0; i < x.length; i++)
            x[i] -= k * e1[i];
 
        while (true) {
            Arrays.fill(xk, 0);
            for (int i = 0; i < a.length; i++)
                for (int j = 0; j < x.length; j++)
                    xk[i] += a[i][j] * x[j];
 
            currentLambda = dotProduct(xk, x) / dotProduct(x, x);
 
            double norma = norma(xk);
            for (int i = 0; i < xk.length; i++)
                xk[i] /= norma;
 
            k = dotProduct(xk, g1) / dotProduct(g1, e1);
 
            for (int i = 0; i < x.length; i++)
                xk[i] -= k * e1[i];
 
            if (Math.abs(currentLambda - lastLambda) < eps
                    && lastLambda != 0.0d)
                break;
 
            lastLambda = currentLambda;
            x = xk.clone();
        }
        for (int i = 0; i < xk.length; i++)
            l2[i] = xk[i];
 
        return currentLambda;
    }
 
    public static double dotProduct(double[] a, double[] b) {
        double sum = 0.0d;
        for (int i = 0; i < a.length; i++)
            sum += a[i] * b[i];
        return sum;
    }
 
    public static double norma(double[] a) {
        return Math.sqrt(dotProduct(a, a));
    }
 
    public static void print(double a[][]) {
        for (int i = 0; i < a.length; i++) {
            for (int j = 0; j < a[i].length; j++)
                System.out.format("%3.2f ", a[i][j]);
            System.out.format("\n");
        }
    }
 
    public static void print(double a[]) {
        for (int i = 0; i < a.length; i++)
            System.out.format("%3.5f ", a[i]);
        System.out.format("\n");
    }
 
}
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
25.12.2013, 15:52
Ответы с готовыми решениями:

F#, Haskel, Erlang
Есть алгоритм на C#/C++/Java (кому что по душе) поиска наибольшего и наименьшего собственного числа...

Ищу интерпретатор Haskel стандарта 98 или как настроить Haskel Platform
Скачал и установил на свой ПК Haskel Platform. Открываю лабу и от туда набираю код. Из лабы. Ну...

Переписать код с использованием цикла while или repeat/until
Как переобразоватъ етот код чтобы был изполъзован цыкл &quot;While&quot; or &quot;Repeat ... Until&quot;? Kод: ...

Переписать код с switch на код с использованием массивов
&lt;?php $action = $_POST; switch($action){ case 'first' echo 'первый' break; case 'red' echo...

6
1192 / 585 / 88
Регистрация: 20.09.2012
Сообщений: 1,877
26.12.2013, 00:42 2
перепиши на C#. Поменяй верхнии for'ы (крому тех что используются для ввода.вывода) на Paralell.For и не мучайся
0
1 / 1 / 2
Регистрация: 20.10.2011
Сообщений: 142
27.12.2013, 09:07  [ТС] 3
Я уже распараллелил на яве, шарпе и плюсах. Мне еще один язык нужен дополнительно
0
1192 / 585 / 88
Регистрация: 20.09.2012
Сообщений: 1,877
27.12.2013, 11:11 4
Лучший ответ Сообщение было отмечено Ev_Hyper как решение

Решение

Рабочесть не гарантируестя
Кликните здесь для просмотра всего текста

F#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
let eps             = 0.0001
 
let dotProduct a b  = Array.fold2 (fun acc a b -> acc + a * b) 0.0 a b
let norma a         = dotProduct a a |> sqrt
let print2 a        = for r in a do printfn "%A" r
let print a         = printfn "%A" a
 
let calcProperNumber1 (a: float[,]) (x: float[]) =
    let x = Array.copy x
    let rec loop (x: float[]) lastLambda = 
        let xk = Array.create x.Length 0.0
        System.Threading.Tasks.Parallel.For(0, x.Length, fun i -> 
            xk.[i] <- x |> Array.mapi (fun j _ -> a.[i,j] * x.[j]) |> Seq.sum
            ) |> ignore
 
        let currentLambda   = dotProduct xk x / dotProduct x x
        let norma           = norma xk
        let xk              = Array.map (fun e -> e / norma) xk
 
        if abs (currentLambda - lastLambda) < eps && lastLambda <> 0.0 
            then xk, currentLambda
            else loop xk currentLambda
    loop x 0.0
 
let calcProperNumber2 (a: _[,]) (x: _[]) (lambda1, l1) =
    let xk      = Array.create x.Length 0.0
    let at      = Array2D.copy a
    let e1      = Array.copy l1
    let g1, _   = calcProperNumber1 at x 
    let k       = dotProduct x g1 / dotProduct e1 g1
    let x       = x |> Array.mapi (fun i e -> e - k * e1.[i])
 
    let rec loop (x: float[])  lastLambda = 
        let xk = Array.create x.Length 0.0
        System.Threading.Tasks.Parallel.For(0, x.Length, fun i -> 
            xk.[i] <- x |> Array.mapi (fun j _ -> a.[i,j] * x.[j]) |> Seq.sum
            ) |> ignore
 
        let currentLambda = dotProduct xk x / dotProduct x x
        let norma   = norma xk
        let xk      = Array.map (fun e -> e / norma) xk
        let k       = dotProduct xk g1 / dotProduct g1 e1
        let xk      = xk |> Array.mapi (fun i e -> e - k * e1.[i])
 
        if abs(currentLambda - lastLambda) < eps && lastLambda <> 0.0 
            then xk, currentLambda
            else loop xk currentLambda
    loop x 0.0
 
 
[<EntryPoint>] 
let main argv = 
 
    let scanner = System.IO.File.ReadAllText("input.txt")
    let scanner = scanner.Split([|' '; '\r'; '\n'; '\t'|], System.StringSplitOptions.RemoveEmptyEntries)
                  |> Array.map float
    let n   = int scanner.[0]
    let eps = scanner.[1]
    let x   = Array.init n (fun i -> scanner.[i + 2])
    let a   = Array2D.init n n (fun a b -> scanner.[2 + (n + 1) * a + b])
    
    let l1, lambda1  = calcProperNumber1 a x 
    printfn "First lambda: %5.5f\nVector:\n" lambda1
    print l1
 
    let l2, lambda2  = calcProperNumber2 a x (lambda1, l1)
    printf "\nSecond lambda: %5.5f\nVector:\n" lambda2
    print l2
 
    System.Console.ReadKey() |> ignore
    0
1
1 / 1 / 2
Регистрация: 20.10.2011
Сообщений: 142
04.01.2014, 13:26  [ТС] 5
Цитата Сообщение от pycture Посмотреть сообщение
Рабочесть не гарантируестя
Кликните здесь для просмотра всего текста

F#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
let eps             = 0.0001
 
let dotProduct a b  = Array.fold2 (fun acc a b -> acc + a * b) 0.0 a b
let norma a         = dotProduct a a |> sqrt
let print2 a        = for r in a do printfn "%A" r
let print a         = printfn "%A" a
 
let calcProperNumber1 (a: float[,]) (x: float[]) =
    let x = Array.copy x
    let rec loop (x: float[]) lastLambda = 
        let xk = Array.create x.Length 0.0
        System.Threading.Tasks.Parallel.For(0, x.Length, fun i -> 
            xk.[i] <- x |> Array.mapi (fun j _ -> a.[i,j] * x.[j]) |> Seq.sum
            ) |> ignore
 
        let currentLambda   = dotProduct xk x / dotProduct x x
        let norma           = norma xk
        let xk              = Array.map (fun e -> e / norma) xk
 
        if abs (currentLambda - lastLambda) < eps && lastLambda <> 0.0 
            then xk, currentLambda
            else loop xk currentLambda
    loop x 0.0
 
let calcProperNumber2 (a: _[,]) (x: _[]) (lambda1, l1) =
    let xk      = Array.create x.Length 0.0
    let at      = Array2D.copy a
    let e1      = Array.copy l1
    let g1, _   = calcProperNumber1 at x 
    let k       = dotProduct x g1 / dotProduct e1 g1
    let x       = x |> Array.mapi (fun i e -> e - k * e1.[i])
 
    let rec loop (x: float[])  lastLambda = 
        let xk = Array.create x.Length 0.0
        System.Threading.Tasks.Parallel.For(0, x.Length, fun i -> 
            xk.[i] <- x |> Array.mapi (fun j _ -> a.[i,j] * x.[j]) |> Seq.sum
            ) |> ignore
 
        let currentLambda = dotProduct xk x / dotProduct x x
        let norma   = norma xk
        let xk      = Array.map (fun e -> e / norma) xk
        let k       = dotProduct xk g1 / dotProduct g1 e1
        let xk      = xk |> Array.mapi (fun i e -> e - k * e1.[i])
 
        if abs(currentLambda - lastLambda) < eps && lastLambda <> 0.0 
            then xk, currentLambda
            else loop xk currentLambda
    loop x 0.0
 
 
[<EntryPoint>] 
let main argv = 
 
    let scanner = System.IO.File.ReadAllText("input.txt")
    let scanner = scanner.Split([|' '; '\r'; '\n'; '\t'|], System.StringSplitOptions.RemoveEmptyEntries)
                  |> Array.map float
    let n   = int scanner.[0]
    let eps = scanner.[1]
    let x   = Array.init n (fun i -> scanner.[i + 2])
    let a   = Array2D.init n n (fun a b -> scanner.[2 + (n + 1) * a + b])
    
    let l1, lambda1  = calcProperNumber1 a x 
    printfn "First lambda: %5.5f\nVector:\n" lambda1
    print l1
 
    let l2, lambda2  = calcProperNumber2 a x (lambda1, l1)
    printf "\nSecond lambda: %5.5f\nVector:\n" lambda2
    print l2
 
    System.Console.ReadKey() |> ignore
    0
А это какой язык?
0
1192 / 585 / 88
Регистрация: 20.09.2012
Сообщений: 1,877
04.01.2014, 13:40 6
Цитата Сообщение от Fresh_MaN Посмотреть сообщение
А это какой язык?
А в каком вы разделе?
1
1 / 1 / 2
Регистрация: 20.10.2011
Сообщений: 142
04.01.2014, 14:42  [ТС] 7
pycture,
Прошу прощения, туплю
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
04.01.2014, 14:42

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Обсуждение возможностей языка D
В данной теме я предлагаю обсуждать интересные (и не очень) возможности языка D, делиться кодом и...

Нужно переписать код простой задачки с языка Java на C# ( до конца не получается )
оригинал на Java (задачка о рюкзаке- жадный алгоритм) public class Main { public static void...

Переписать код с использованием Qt
Здравствуйте. помогите, пожалуйста, переписать код под qt. Выдает ошибки #include &quot;widget.h&quot;...

Переписать код с использованием указателей
помогите пожалуйста, нужно не использовать а все сделать через указатели #include &quot;stdafx.h&quot;...

Переписать код с использованием конструктора
Не совсем понятно как эту программу написать с использованием конструктора... не могли бы объяснить...

Переписать код с использованием указателей
Помогите сделать указатели... #include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; #include &lt;locale.h&gt; ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.