IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
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.