» »

mnozenje matrik

mnozenje matrik

desperados ::

Žiw a morda kdo pozna kak algoritem za množenje matrik ne glede na velikost v c++ s polj???

hvala
LP!

OwcA ::

Brute force? ;)

Kaj zelo pod O(n^3) v splošnem ne prideš. Malo si mogoče poglej Strassenovo formulo.
Otroška radovednost - gonilo napredka.

Zgodovina sprememb…

  • spremenilo: OwcA ()

desperados ::

vem da mora biti algoritm sestavljen nekako v tem principu

int sestevki=0;
for (int a=0 ,a < s1, a++)
for (int b=0, b < v1 ,b++)
{
for (int c=0 , c < s2, c++)
sestevki+=matrika1[a][c]*matrika2[c][b]; //množenje matrik
zmnozek[a][b]=sestevki;
sestevki=0;
}


ampak ta koda deluje le za kvadratne matrike.
Za njima pa me če kdo zna kodo spremeniti tako da bo zmnožila recimo matriko

a=[1 2 3;4 5 6]
b=[1 2;3 4;5 6]
?=a*b

kake ideje?

hvala
LP!

JerKoJ ::

Eto najprej mal teorije,
da lohk pol iz nje sploh sestavs algoritem

http://mathworld.wolfram.com/MatrixMultiplication.html

ce si seveda neucekan lahko v guglu napises : c programm matrix multiplication

ce mas dela z ogromnimi matrikami se tega ne lotevat sam
dobi si scilab ali kupi matlab pa tam to deli

desperados ::

Žiw
no ne da bi bil neučakan samo tole pa res nucam hitro.

je naloga za zagovor vaj
ampak na žalost nisem tako dober matematik in ne programer da bi mi algoritem kar padel v konice prstov da bi spisal kodo

poleg tega je problem v mejah danih polj

ampak z debugom pa ne znam delat da bi pogruntal kje je problem

algoritem je že pravi samo koda ni pravilno napisana

LP!

Zgodovina sprememb…

OwcA ::

Sicer se nisem pretirano pogljabljal, ampak tisto zgoraj zgleda prav, le s1, s2 in v1 moraš prav nastaviti, poleg tega seveda ne moreš množiti poljubnih 2 matrik ampak samo tiste, za katere velja, da je število stolpcev prve enako številu vrstic druge.
Otroška radovednost - gonilo napredka.

desperados ::

ja to je pogoj:O

if(s1==v2)
{...}

ze ampak; kako je treba nastavit vse te stvari

moj namen je bil napisati program za sestevanje in mnozenje matrik najprej se ustvaril 4 polja velikosti 50x50 in potem znotraj teh polj operiram z vecdimenzionalnimi polji. no ravno tukaj je problem ce sem hotel zmnoziti nekvadratni matriki mi je zacelo vpisovati neka cudna stevila ampak preko mej katere sem zahteval, torej stevilo vrstic 1 matrike in stevilo stolpcev druge.

ko mi je nekako uspelo izpisovati pravo velikost mi ni racunal pracilnih vrednosti najbrz ni pravilno sesteval. no to je v bistvu moj problem
ena od moznosti je napacna zadna zanka in elementi.

sestevanje pa dela kot urca

no danes sem ze za itak zamudil zagovor tak da jutri ne morem na izpit

AMPAK POMOC JE PA SE VSEENO DOBRODOSLA!!!:D

LP

Zgodovina sprememb…

OwcA ::

V katerem jeziku to packaš? V vsakem primeru raje uporabi kakšno prijazno podatkovno strukturo, recimo vektor, ker imaš očitno težave s polji.
Otroška radovednost - gonilo napredka.

Geny ::

Ti kolega, jaz sicer nebi rad bil nesramen ampak predno greš na izpit se nauči še nekaj teorije o matrikah, ker za množenje matrik veljajo posebna pravila.
Prva matrika mora imeti ravno toliko stolpec, kolikor ima druga matrika vrstic. To je pravilo ker drugače se matrik med sabo ne da ZMNOŽIT!
Uf!...;((
To mi deli!

alum ::

mnozenje matrik A in B, rezultat matrika C...
velikost matike A: m x n
velikost matrike B: n x p
velikost matrike c: m x p

n mora bit nujno enak pri obeh matrikah!!! NUJNO!

pseudokod bi zgledal nekako takole...

FOR(i=0, i < m)
FOR(j=0, j < p)
C[0][0]=0;
FOR(k=0, k < n)
C[i][j]= A[i][k] * B[k][j] + C[i][j];
END FOR
END FOR
END FOR

je pa res, da ti tukaj casovna zahtevnost ne pade pod o(n^3) - mislim, da ga "zaenkrat" se ne znajo izboljsat...

brez teorije pa bos ostal le pri praskanju po glavi:)

desperados ::

ja teorijo matrik poznam
implementacija me jebe
pa program mora bit napisan z polji v c++ konzola;(

Zgodovina sprememb…

OwcA ::

Naredi stvar kot se spodobi, torej z dinamičnim zaseganjem spomina.
Otroška radovednost - gonilo napredka.

desperados ::

ja če bi bilo po moje bi to naredil z gnezdenim dvosmernim seznamom sam naloga (asistent je pac zelo natančen) zahta predpotopna dvodimezionalna polja;(

Vesoljc ::

hehe in to z razlogom :)
Abnormal behavior of abnormal brain makes me normal...

Gundolf ::

Če bi pa množenje matrik delal z dvosmernimi seznami potem pa še dobro da asistent vztraja na built-in 2d poljih.:D

alum ::

implementacijo imas zgoraj...vse kar je potrebno naredit je, da jo pretvoris v C++...

cel algoritem imas napisan, le problem z velikostjo moras resit...to pa prepuscam tebi;)

Thomas ::

> C[0][0]=0;

C[i][j]=0;

alum ::

C[i][j]=0;


true:)

desperados ::

No uspelo mi je res da z razredi
upam da ne bo asistent mel kej proti
kaj češ

pa še kek teden prekasno


recimo tole je množenje :
void MATRIKE::Zmnozek () 
{
    if (stolpcev1==vrstic2)
	{
	for (int i=0; i  < vrstic1; i++)
		{
		for (int j=0; j < stolpcev2; j++)
			{
			mZmnozek[i][j]=0;
				for (int k=0; k < vrstic2; k++)
					{
                       	mZmnozek[i][j]+=matrika1[i][k]*matrika2[k][j];
                    }
           	}
        }
     }
   	else cout << "Stevilo stolpcev prve natrike ni enako stevilu vrstic druge (mnozenje teh dveh matrik ni definirano)\n";
 }


tole pa sestevanje:
void MATRIKE::Sestevek ()
{
	if (stolpcev1==stolpcev2 && vrstic1==vrstic2)
	{
		for (int i=0; i < vrstic1; i++)
		{
		for (int j=0; j < stolpcev1; j++)
			{
			mSestevek[i][j]=matrika1[i][j] + matrika2[i][j];
			}
		}
	}
	else cout <<  "Matriki nista enakih dimenzij (sestevanje ni definirano)\n";
}



no pa hvala za vso pomoč

[edit: polepšana koda]

Zgodovina sprememb…

  • spremenil: Gundolf ()

Vesoljc ::

zdej si pa še poglej kako narediš operatorje.

ker lepšega kot tole ni:
matrix a,b,c;
a = b + c;
Abnormal behavior of abnormal brain makes me normal...


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

Visual Basic - matrike z datagridview

Oddelek: Programiranje
81238 (910) blay44
»

Matrike

Oddelek: Šola
121623 (1206) Sqrt2
»

c++ nujno

Oddelek: Programiranje
51044 (974) Tutankhamun
»

Program v C

Oddelek: Programiranje
51917 (1756) darkkk
»

[Naloga][C++] Mnozenje vecdimenzionalnih polj.

Oddelek: Programiranje
51612 (1505) wat56

Več podobnih tem