C# týden ITnetwork Flashka zdarma
Akce! Pouze tento týden sleva až 80 % na kurzy C# .NET. Lze kombinovat s akcí 50 % bodů navíc na prémiový obsah!
Brno? Vypsali jsme pro vás nové termíny školení Základů programování a OOP v Brně!

Diskuze: Násobení matic paralelním forem

Aktivity (4)
Avatar
Tomáš Berky:13. května 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. května 16:19
Avatar
STP
Člen
Avatar
STP:13. května 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  +1 13. května 17:40
Když umřít, tak online!!!
Avatar
Odpovídá na STP
Tomáš Berky:14. května 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. května 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.