다항식 연산
다항식(Polynomial)과 다항식 간의 연산은 신호처리 과정에서 가끔 사용합니다. 특히 필터 합성에서 계수를 합성할 때 사용합니다. 이 글에서는 C#으로 다항식의 덧셈과 곱셈을 하는 클래스를 만들어 보겠습니다.
다항식 연산용 클래스
다음과 같이 다항식의 차수 degree와 차수별 계수를 기록하는 클래스를 만듭니다. 계수 coef는 차수보다 1개 더 많이 사용됩니다. 즉 degree = 2면 $a_2 x^2 + a_1 x + a_0 $ 형식으로, coef []는 $[a_2, a_1, a_0 ]$로 기록됩니다.
아래의 클래스는 Add()는 다항식 덧셈 연산을, Multiply()는 다항식 곱셉 연산을 합니다.
using System;
namespace test_IIR_FreqResponse {
public class Polynomial{
private int _degree;
private float[] _coef = new float[93];
/// <summary>
/// </summary>
public Polynomial(){; }
/// <summary>
/// </summary>
public Polynomial(int degree) {
_degree = degree;
}
/// <summary>
/// </summary>
public void Clear(){
_degree = 0;
for(int i =0;i<93;i++){
_coef[i] = 0.0f;
}
}
/// <summary>
/// </summary>
public int Degree{
get{ return _degree; }
set{ _degree = value; }
}
/// <summary>
/// </summary>
public float Get_Coef(int idx){
return _coef[idx];
}
/// <summary>
/// </summary>
public void Set_Coef(int idx, float value){
_coef[idx] = value;
}
/// <summary>
/// idx+1 = degree 로 입력 해야 한다.
/// 2차면 3개를 초고차 항부터...
/// </summary>
public void Insert(int idx,float value){
_coef[idx] = value;
}
public void Insert(ref float[] values){
for(int i=0;i<values.Length;i++){
_coef[i] = values[i];
}
}
/// <summary>
/// </summary>
public void Print() {
string str = "";
for(int i = 0;i < _degree;i++) {
str = string.Format("({0:0.000}*x^{1})",_coef[i],(_degree - i));
Console.Write(str);
if(_coef[i + 1] > 0) {
Console.Write("+");
}
}
str = string.Format("({0:0.000)\r\n}",_coef[_degree]);
Console.Write(str);
}
/// <summary>
/// </summary>
public void Add(Polynomial a,Polynomial b) {
if(a.Degree > b.Degree) {
this.Copy(a);
for(int i = 0;i <= b.Degree;i++) {
_coef[i + (_degree - b.Degree)] += b.Get_Coef(i);
}
}
else {
this.Copy(b);
for(int i = 0;i <= b.Degree;i++) {
_coef[i + (_degree - a.Degree)] += a.Get_Coef(i);
}
}
}
/// <summary>
/// </summary>
private void Copy(Polynomial a){
_degree = a.Degree;
for(int i =0;i<93;i++){
_coef[i] = a.Get_Coef(i);
}
}
/// <summary>
/// </summary>
public void Multiply(Polynomial a,Polynomial b) {
_degree = a.Degree + b.Degree;
for(int i = 0;i < a.Degree + b.Degree + 1;i++) {
_coef[i] = 0;
}
for(int i = 0;i < a.Degree + 1;i++) {
for(int j = 0;j < b.Degree + 1;j++) {
_coef[i + j] += a.Get_Coef(i) * b.Get_Coef(j);
}
}
}
} //- class
}//- namespace
덧셈 실험
다음과 같이 초기화하고 다항식 덧셈 결과를 보겠습니다.
using System;
namespace test_IIR_FreqResponse {
class Program {
static void Main(string[] args) {
Polynomial a = new Polynomial();
Polynomial b = new Polynomial();
Polynomial p = new Polynomial();
a.Degree=2;
b.Degree=2;
float[] coef = new float[3] {1.0f,1.0f,1.0f};
a.Insert(ref coef);
b.Insert(ref coef);
p.Add(a,b);
p.Print();
Console.ReadKey();
}
}
}
그러면 아래와 같이 출력이 됩니다.
(2.000*x^2)+(2.000*x^1)+(2.000)
다항식 곱셈 실험
다항식 곱셈의 실험을 합니다.
using System;
namespace test_IIR_FreqResponse {
class Program {
static void Main(string[] args) {
Polynomial a = new Polynomial();
Polynomial b = new Polynomial();
Polynomial p = new Polynomial();
a.Degree=2;
b.Degree=2;
float[] coef = new float[3] {1.0f,1.0f,1.0f};
a.Insert(ref coef);
b.Insert(ref coef);
p.Multiply(a,b);
p.Print();
Console.ReadKey();
}
}
}
출력 결과는 다음과 같습니다. 2x2차원의 다항식 계산으로 $x^4$로 출력되고 있습니다.
(1.000*x^4)+(2.000*x^3)+(3.000*x^2)+(2.000*x^1)+(1.000)
광고좀 꾹 눌러주시면 고맙겠습니다.
위의 내용을 참조용으로만 사용해주세요. 무단 도용이나 무단 복제는 불허합니다.
기타 문의 사항은 gigasound@naver.com에 남겨 주시면 고맙겠습니다.
'C#, MONO' 카테고리의 다른 글
c# 프로세스 동작시간 측정 (0) | 2021.11.12 |
---|---|
c#의 구조체 (0) | 2021.10.08 |
c#의 배열과 리스트 (0) | 2021.10.06 |
c#의 Enum 멤버의 정보 추출 (0) | 2021.10.06 |
테이블 컬럼 조작 (0) | 2021.08.21 |