Využij akce až 80 % zdarma při nákupu e-learningu. Více informací.
Pouze tento týden sleva až 80 % na e-learning týkající se Pythonu
python week

Diskuze: Násobení matic paralelním forem

Aktivity
Avatar
Tomáš Berky:13.5.2019 16:19

Visual studio mi pořád vyhazuje chybu "System.IndexOu­tOfRangeExcep­tion: Index je mimo hranice pole." a já si s ní nedokážu poradit.

Zkusil jsem: using System;
using System.Collec­tions.Generic;
using System.Linq;
using System.Text;
using System.Threadin­g.Tasks;

namespace Matice
{
class Program
{
static void Seriove(double[,] matA, double[,] matB, double[,] vysledek)
{
int matAs = matA.GetLength(1);
int matBs = matB.GetLength(1);
int matAr = matA.GetLength(0);

for(int i = 0; i < matAr; i++)
{
for(int j = 0; j < matBs; j++)
{
double temp = 0;
for(int k = 0; k < matAs; k++)
{
temp += matA[i, k] * matB[k, j];
}
vysledek[i, j] += temp;
}
}
}

static void Paralelne(double[,] matA, double[,] matB, double[,] vysledek)
{
int matAs = matA.GetLength(1);
int matBs = matB.GetLength(1);
int matAr = matA.GetLength(0);

Parallel.For(0, matAr, i =>
{
for (int j = 0; j < matBs; j++)
{
double temp = 0;
for (int k = 0; k < matAs; k++)
{
temp = matA[i, k] * matB[k, j];
}
vysledek[i, j] = temp;
}
});
}

static double[,] VyplneniMatice(int radky, int sloupce)
{
double[,] matice = new double[radky, sloupce];

Random r = new Random();
for (int i = 0; i < radky; i++)
{
for (int j = 0; j < sloupce; j++)
{
matice[i, j] = r.Next(100);
}
}
return matice;
}

static void Main(string[] args)
{
int pocetS = 10;
int pocetR = 15;
int pocetS2 = 20;
double[,] m1 = VyplneniMatice(po­cetR, pocetS);
double[,] m2 = VyplneniMatice(po­cetS, pocetS2);
double[,] result = new double[pocetR, pocetS2];

Console.Write­Line("Sériový výpočet");
var Scas = System.Diagnos­tics.Stopwatch­.StartNew();
Scas.Start();

Seriove(m1, m2, result);
Scas.Stop();
Console.Write­Line("Sériový výpočet trval: {0}",
Scas.ElapsedMi­lliseconds);

var Pcas = System.Diagnos­tics.Stopwatch­.StartNew();
result = new double[pocetS, pocetS2];

Console.Error­.WriteLine("Pa­ralelní výpočet");
Pcas.Start();
Paralelne(m1, m2, result);
Pcas.Stop();
Console.Write­Line("Paralel­ní výpočet trval: {0}",
Pcas.ElapsedMi­lliseconds);

Console.ReadKey();
}
}
}

Chci docílit: Jako seminární práci mám porovnat čas sériového a paralelního výpočtu násobení matic v c#.

 
Odpovědět
13.5.2019 16:19
Avatar
STP
Člen
Avatar
STP:13.5.2019 17:40

Ahoj

Řádek

result = new double[pocetS, pocetS2];

vyměň za

result = new double[pocetR, pocetS2];

A přestane to padat :)

Akceptované řešení
+20 Zkušeností
+1 bodů
Řešení problému
Nahoru Odpovědět
13.5.2019 17:40
Když umřít, tak online!!!
Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!
Avatar
Odpovídá na STP
Tomáš Berky:14.5.2019 11:12

Jsem hlupák, celý dopoledne jsem do toho včera čuměl a nenašel jsem to :D díky.

 
Nahoru Odpovědět
14.5.2019 11:12
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 3 zpráv z 3.