forked from Alexey/DAS_2024_1
57 lines
1.7 KiB
C#
57 lines
1.7 KiB
C#
using System;
|
||
using System.Threading.Tasks;
|
||
|
||
public class MatrixMultiplication
|
||
{
|
||
// Обычный метод умножения матриц
|
||
public static int[,] MultiplySequential(int[,] matrixA, int[,] matrixB)
|
||
{
|
||
int size = matrixA.GetLength(0);
|
||
int[,] result = new int[size, size];
|
||
|
||
for (int i = 0; i < size; i++)
|
||
{
|
||
for (int j = 0; j < size; j++)
|
||
{
|
||
int sum = 0;
|
||
for (int k = 0; k < size; k++)
|
||
{
|
||
sum += matrixA[i, k] * matrixB[k, j];
|
||
}
|
||
result[i, j] = sum;
|
||
}
|
||
}
|
||
|
||
return result;
|
||
}
|
||
|
||
// Параллельный метод умножения матриц с заданием количества потоков
|
||
public static int[,] MultiplyParallel(int[,] matrixA, int[,] matrixB, int threadCount)
|
||
{
|
||
int size = matrixA.GetLength(0);
|
||
int[,] result = new int[size, size];
|
||
int chunkSize = size / threadCount;
|
||
|
||
Parallel.For(0, threadCount, threadIndex =>
|
||
{
|
||
int startRow = threadIndex * chunkSize;
|
||
int endRow = (threadIndex == threadCount - 1) ? size : startRow + chunkSize;
|
||
|
||
for (int i = startRow; i < endRow; i++)
|
||
{
|
||
for (int j = 0; j < size; j++)
|
||
{
|
||
int sum = 0;
|
||
for (int k = 0; k < size; k++)
|
||
{
|
||
sum += matrixA[i, k] * matrixB[k, j];
|
||
}
|
||
result[i, j] = sum;
|
||
}
|
||
}
|
||
});
|
||
|
||
return result;
|
||
}
|
||
}
|