Essays.club - Получите бесплатные рефераты, курсовые работы и научные статьи
Поиск

Методы умножения матриц и векторов C#

Автор:   •  Апрель 2, 2020  •  Лабораторная работа  •  4,006 Слов (17 Страниц)  •  387 Просмотры

Страница 1 из 17

using System;

using System.Collections.Generic;

using System.Text;

using System.Diagnostics;

using System.Linq;

using System.Threading;

namespace PPLab3

{

public class Parameters

{

public int X { get; private set; }

public int Y { get; private set; }

public int Z { get; private set; }

public int W { get; private set; }

public Parameters(int x, int y, int z)

{

X = x;

Y = y;

Z = z;

}

public Parameters(int x, int y, int z, int w):this(x,y,z)

{

W = w;

}

}

class MatrixMatrixSample

{

public int[,] matrixA { get; set; }

public int[,] matrixB { get; set; }

public int[,] result { get; set; }

public int minValue { get; set; } = 1;

public int maxValue { get; set; } = 5;

public int N { get; set; }

public int M { get; set; }

public int K { get; set; } = 3;

public int ThreadCount { get; set; } = 2;

public double ElapsedSeconds { get; set; }

public MatrixMatrixSample(int n, int m)

{

N = n;

M = m;

Fill();

}

public void MultiplyColumn()

{

result = new int[matrixA.GetLength(0), matrixB.GetLength(1)];

var sw = Stopwatch.StartNew();

for (int i = 0; i < matrixB.GetLength(1); i++)

for (int t = 0; t < matrixA.GetLength(0); t++)

for (int j = 0; j < matrixB.GetLength(0); j++)

result[t, i] += matrixA[t, j] * matrixB[j, i];

sw.Stop();

ElapsedSeconds = sw.Elapsed.TotalSeconds;

}

public void MultiplyColumnParallel()

{

var time = new List<double>();

for (int k = 0; k < K; k++)

{

result = new int[matrixA.GetLength(0), matrixB.GetLength(1)];

Thread[] threads = new Thread[ThreadCount];

var sw = Stopwatch.StartNew();

for (int n = 0; n < ThreadCount; n++)

{

threads[n] = new Thread(x => {

for (int i = (int)x; i < matrixB.GetLength(1); i += ThreadCount)

for (int t = 0; t < matrixA.GetLength(0); t++)

for (int j = 0; j < matrixB.GetLength(0); j++)

result[t, i] += matrixA[t, j] * matrixB[j, i];

});

threads[n].Start(n);

}

foreach (var thread in threads) thread.Join();

sw.Stop();

if (k > 0) time.Add(sw.Elapsed.TotalSeconds);

}

ElapsedSeconds = time.Average();

}

public void MultiplyFox()

{

result = new int[matrixA.GetLength(0), matrixB.GetLength(1)];

var q = 2;

var c = matrixA.GetLength(0) / q;

var sw = Stopwatch.StartNew();

for (int l = 0; l < q; l++)

{

for (int i = 0; i < q; i++)

{

var m = (i + l) % q;

for (int j = 0; j < q; j++)

MultiplyFox(i, j, m, c);

}

}

sw.Stop();

ElapsedSeconds

...

Скачать:   txt (8.9 Kb)   pdf (47 Kb)   docx (11.6 Kb)  
Продолжить читать еще 16 страниц(ы) »
Доступно только на Essays.club