Black Friday je tu! Využij jedinečnou příležitost a získej až 80 % znalostí navíc zdarma! Více zde
Aktualizovali jsme provozní podmínky. Pokračováním užívání sítě s nimi projevíte souhlas.
BF extended 2022

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í
+2,50 Kč
Řešení problému
Nahoru Odpovědět
13.5.2019 17:40
Když umřít, tak online!!!
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.