C\#계산 행렬 의 순위 인 스 턴 스 분석

7013 단어 C#행렬
본 논문 의 사례 는 C\#행렬 의 질 서 를 계산 하 는 방법 을 서술 하 였 다.모두 에 게 참고 하도록 공유 하 다.구체 적 으로 다음 과 같다.
1.코드 사고
행렬 의 질 서 를 계산 하 는 것 은 행렬 을 초등 으로 바 꾸 어 얻 은 줄 의 가장 간단 한 행렬 의 비 0 행 수 이다.과정 은 다음 과 같다.
1)행렬 의 각 줄 을 첫 번 째 비 0 요소 가 나타 난 위치 에 따라 오름차 순 으로 배열(Operation 1 함수)
2)행렬 이 줄 의 가장 간단 한 행렬 인지 확인 합 니 다(isFinished 함수).예 를 들 어 6 단계 까지 입 니 다.그렇지 않 으 면 3 단계 까지 입 니 다.
3)두 줄 의 첫 번 째 비 0 요소 가 나타 나 는 위치 가 같 으 면 소 법 변환 을 하여 다음 줄 의 첫 번 째 비 0 요소 위 치 를 뒤로 이동 시 킵 니 다(Operation 2 함수)
4)행렬 의 각 줄 을 첫 번 째 비 0 요소 가 나타 난 위치 에 따라 오름차 순 으로 배열(Operation 1 함수)
5)2 단계 로 돌아 가기
6)오 차 를 판단 하고 가 까 워 지 는 요소(예 를 들 어 1E-5)를 0 으로 처리 하여 7 단계 오심(Operation 3 함수)을 피한다.
7)0 줄 이 아 닌 숫자(Operation 4 함수)를 통계 하 는 것 은 행렬 의 순위 이다.
2.함수 코드
(비고:이 단락 코드 는 하나의 사고방식 만 실 현 했 을 뿐 이 문제 의 가장 좋 은 해답 이 아 닐 수도 있 습 니 다)

/// <summary>
///       
/// </summary>
/// <param name="matrix">  </param>
/// <returns></returns>
private static int Rank(double[][] matrix)
{
  //matrix              
  if (matrix == null || matrix.Length == 0) return 0;
  //    matrix copy,                matrix  
  double[][] copy = new double[matrix.Length][];
  for (int i = 0; i < copy.Length; i++)
  {
    copy[i] = new double[matrix[i].Length];
  }
  for (int i = 0; i < matrix.Length; i++)
  {
    for (int j = 0; j < matrix[0].Length; j++)
    {
      copy[i][j] = matrix[i][j];
    }
  }
  //                
  Operation1(copy);
  //      
  while (!isFinished(copy))
  {
    Operation2(copy);
    Operation1(copy);
  }
  //    0  ,  0,    
  Operation3(copy);
  //           
  return Operation4(matrix);
}
/// <summary>
///              (        )
/// </summary>
/// <param name="matrix"></param>
/// <returns>true:</returns>
private static bool isFinished(double[][] matrix)
{
  //                
  int[] counter = new int[matrix.Length];
  for (int i = 0; i < matrix.Length; i++)
  {
    for (int j = 0; j < matrix[i].Length; j++)
    {
      if (matrix[i][j] == 0)
      {
        counter[i]++;
      }
      else break;
    }
  }
  //                     ,     
  for (int i = 1; i < counter.Length; i++)
  {
    if (counter[i] <= counter[i - 1] && counter[i] != matrix[0].Length)
    {
      return false;
    }
  }
  return true;
}
/// <summary>
///   (                  )
/// </summary>
/// <param name="matrix">  </param>
private static void Operation1(double[][] matrix)
{
  //                
  int[] counter = new int[matrix.Length];
  for (int i = 0; i < matrix.Length; i++)
  {
    for (int j = 0; j < matrix[i].Length; j++)
    {
      if (matrix[i][j] == 0)
      {
        counter[i]++;
      }
      else break; 
    }
  }
  //                
  for (int i = 0; i < counter.Length; i++)
  {
    for (int j = i; j < counter.Length; j++)
    {
      if(counter[i]>counter[j])
      {
        double[] dTemp = matrix[i];
        matrix[i] = matrix[j];
        matrix[j] = dTemp;
      }
    }
  }
}
/// <summary>
///      (              ,     )
/// </summary>
/// <param name="matrix">  </param>
private static void Operation2(double[][] matrix)
{
  //                
  int[] counter = new int[matrix.Length];
  for (int i = 0; i < matrix.Length; i++)
  {
    for (int j = 0; j < matrix[i].Length; j++)
    {
      if (matrix[i][j] == 0)
      {
        counter[i]++;
      }
      else break;
    }
  }
  for (int i = 1; i < counter.Length; i++)
  {
    if (counter[i] == counter[i - 1] && counter[i] != matrix[0].Length)
    {
      double a = matrix[i - 1][counter[i - 1]];
      double b = matrix[i][counter[i]]; //counter[i]==counter[i-1]
      matrix[i][counter[i]] = 0;
      for (int j = counter[i] + 1; j < matrix[i].Length; j++)
      {
        double c = matrix[i - 1][j];
        matrix[i][j] -= (c * b / a);
      }
      break;
    }
  }
}
/// <summary>
///   0         0
/// </summary>
/// <param name="matrix"></param>
private static void Operation3(double[][] matrix)
{
  for (int i = 0; i < matrix.Length; i++)
  {
    for (int j = 0; j < matrix[0].Length; j++)
    {
      if (Math.Abs(matrix[i][j]) <= 0.00001)
      {
        matrix[i][j] = 0;
      }
    }
  }
}
/// <summary>
///          
/// </summary>
/// <param name="matrix"></param>
/// <returns></returns>
private static int Operation4(double[][] matrix)
{
  int rank = -1;
  bool isAllZero = true;
  for (int i = 0; i < matrix.Length; i++)
  {
    isAllZero = true;
    //        0
    for (int j = 0; j < matrix[0].Length; j++)
    {
      if (matrix[i][j] != 0)
      {
        isAllZero = false;
        break;
      }
    }
    //  i   0,      i
    if (isAllZero)
    {
      rank = i;
      break;
    }
  }
  //       
  if (rank == -1)
  {
    rank = matrix.Length;
  }
  return rank;
}

3.Main 함수 호출

static void Main(string[] args)
{
  //    1:  3
  double[][] matrix1 = new double[][] 
  {
    new double[] { 1, 1, 1 },
    new double[] { 1, 1, 0 },
    new double[] { 0, 1, 1 } 
  };
  Console.WriteLine(Rank(matrix1));
  //    2:  3
  double[][] matrix2 = new double[][] 
  {
    new double[] { 3, 2, 0, 5, 0 }, 
    new double[] { 3, -2, 3, 6, -1 },
    new double[] { 2, 0, 1, 5, -3 },
    new double[] { 1, 6, -4, -1, 4 } 
  };
  Console.WriteLine(Rank(matrix2));
  //    3:  3
  double[][] matrix3 = new double[][] 
  {
    new double[] { 2, 3, 1, -3, -7 }, 
    new double[] { 1, 2, 0, -2, -4 },
    new double[] { 3, -2, 8, 3, 0 },
    new double[] { 2, -3, 7, 4, 3 }
  };
  Console.WriteLine(Rank(matrix3));
  Console.ReadLine();
}

4.실행 결과

본 고 에서 말 한 것 이 여러분 의 C\#프로 그래 밍 에 도움 이 되 기 를 바 랍 니 다.

좋은 웹페이지 즐겨찾기