Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using System;
- public class GaussMatrixF
- {
- public class Row
- {
- public float[] cols;
- public Row(int aCols)
- {
- cols = new float[aCols];
- }
- public void Multiply(float aVal)
- {
- for (int i = 0; i < cols.Length; i++)
- cols[i] *= aVal;
- }
- public void Add(Row aRow, float aVal)
- {
- for (int i = 0; i < cols.Length; i++)
- cols[i] = cols[i] + aRow.cols[i] * aVal;
- }
- public override string ToString()
- {
- var sb = new System.Text.StringBuilder();
- sb.Append(cols[0]);
- for (int i = 1; i < cols.Length; i++)
- sb.Append(",\t").Append(cols[i]);
- return sb.ToString();
- }
- }
- public Row[] rows;
- public GaussMatrixF(int aCols, int aRows)
- {
- rows = new Row[aRows];
- for (int i = 0; i < aRows; i++)
- rows[i] = new Row(aCols);
- }
- public bool CreateUpperTriangle(out float det)
- {
- det = 1;
- for(int i = 0; i < rows.Length; i++)
- {
- var index = FindPivot(i);
- if (index == -1)
- {
- det = 0;
- return false;
- }
- if (index != i)
- {
- Swap(i, index);
- det = -det;
- }
- var r = rows[i];
- if (r.cols[i] != 1)
- {
- det *= r.cols[i];
- r.Multiply(1 / r.cols[i]);
- r.cols[i] = 1;
- }
- for (int n = i + 1; n < rows.Length; n++)
- {
- if (rows[n].cols[i] != 0)
- {
- rows[n].Add(r, -rows[n].cols[i]);
- rows[n].cols[i] = 0;
- }
- }
- }
- return true;
- }
- public bool Solve()
- {
- float det;
- if (!CreateUpperTriangle(out det))
- return false;
- for (int i = 1; i < rows.Length; i++)
- {
- var r = rows[i];
- for (int n = 0; n < i; n++)
- {
- if (rows[n].cols[i] != 0)
- {
- rows[n].Add(r, -rows[n].cols[i]);
- rows[n].cols[i] = 0;
- }
- }
- }
- return true;
- }
- void Swap(int a, int b)
- {
- var tmp = rows[a];
- rows[a] = rows[b];
- rows[b] = tmp;
- }
- private int FindPivot(int aCol)
- {
- int index = -1;
- float val = 0;
- for(int i = aCol; i < rows.Length; i++)
- {
- var v = rows[i].cols[aCol];
- if (v < 0)
- v = -v;
- if (v > 1)
- v = 1 / v;
- if (v > val )
- {
- val = v;
- index = i;
- }
- }
- return index;
- }
- public override string ToString()
- {
- var sb = new System.Text.StringBuilder();
- sb.Append(rows[0]);
- for (int i = 1; i < rows.Length; i++)
- sb.AppendLine().Append(rows[i]);
- return sb.ToString();
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement