using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace Sistema
{
class MRettangolare
{
protected double[] vettore = null;
private int righe, colonne;
public MRettangolare(int quanteRighe, int quanteColonne)
{
righe = Math.Abs(quanteRighe);
colonne = Math.Abs(quanteColonne);
if ((righe * colonne) == 0)
throw new Exception
($
"Impossile creare una matrice {righe} * {colonne}");
vettore
= new Double[righe
* colonne
];
for (int i = 0; i < vettore.Length; i++)
vettore[i] = 0.0;
}
public int Righe
{
get
{
return righe;
}
}
public int Colonne
{
get
{
return colonne;
}
}
public double this[int riga, int colonna]
{
set
{
ControlloDimensioni(riga, colonna);
vettore[riga * this.colonne + colonna] = value;
}
get
{
ControlloDimensioni(riga, colonna);
return vettore[riga * this.colonne + colonna];
}
}
protected void ControlloDimensioni(int riga, int colonna)
{
if (!((riga >= 0) && (riga < righe) && (colonna >= 0) && (colonna < colonne)))
{
throw new OverflowException
($
"Impoeeiobile accedere alla cella [{riga}] [{colonna}]");
}
}
public override string ToString()
{
System.Text.
StringBuilder esito
= new System.Text.
StringBuilder("", 1000
);
for (int i = 0; i < vettore.Length; i++)
{
if ((i > 0) && ((i % colonne) == 0))
esito.Append('\n');
esito.AppendFormat("{0,11:f4}", vettore[i]);
}
esito.Append("\n");
return esito.ToString();
}
public static MRettangolare operator *(double scalare, MRettangolare m)
{
return m * scalare;
}
public static MRettangolare operator *(MRettangolare m, double scalare)
{
int i, j;
MRettangolare esito;
if (m.
GetType() == typeof(Matrice
))
esito
= new Matrice
(m.
righe);
else
esito
=new MRettangolare
(m.
righe, m.
colonne);
for (i = 0; i < m.righe; i++)
{
for (j = 0; j < m.colonne; j++)
{
esito[i, j] = scalare * m[i, j];
}
}
return esito;
}
public static MRettangolare operator *(MRettangolare sinistra, MRettangolare destra)
{
int fineRighe, fineColonne;
if (sinistra.righe != destra.colonne)
throw new Exception
("\nImpossibile moltiplicare due matrici con dimensioni diverse.\n");
fineRighe = sinistra.colonne;
fineColonne = destra.colonne;
MRettangolare esito;
if (fineRighe == fineColonne)
esito
= new Matrice
(fineRighe
);
else
esito
= new MRettangolare
(fineRighe, fineColonne
);
for (int Riga = 0; Riga < fineRighe; Riga++)
{
for (int Colonna = 0; Colonna < fineColonne; Colonna++)
{
esito[Riga, Colonna] = 0.0;
for (int l = 0; l < fineRighe; l++)
{
esito[Riga, Colonna] += sinistra[Riga, l] * destra[l, Colonna];
}
}
}
return esito;
}
public static MRettangolare operator +(MRettangolare sinistra, MRettangolare destra)
{
int i, j, fineRighe, fineColonne;
if ((sinistra.righe != destra.Righe) || (sinistra.righe != destra.colonne))
throw new Exception
("\nImpossibile sommare due matrici con dimensioni diverse.\n");
fineRighe = sinistra.righe;
fineColonne = sinistra.colonne;
MRettangolare risultato;
if (fineRighe == fineColonne)
risultato
= new Matrice
(fineRighe
);
else
risultato
= new MRettangolare
(fineRighe, fineColonne
);
for (i = 0; i < fineRighe; i++)
{
for (j = 0; j < fineColonne; j++)
{
risultato[i, j] = sinistra[i, j] + destra[i, j];
}
}
return risultato;
}
}
}