2016年10月26日 星期三

小山的 C# 教學-第38課-Multidimensional Arrarys 多維陣列

本課簡介

之前在 22 課中有教過大家使用陣列
其實那些陣列都屬於一維陣列

陣列除了一維的之外,還可以有更高的維度
這次的課程將教大家如何使用更進階的多維陣列

教學影片

注意:影片有高畫質 720P 的選項,可以看得更清楚喔!




重點提示

1. 多維陣列中的元素需要超過一個以上的索引 (編號) 才能指出元素的位置。需要兩個索引的陣列稱為二維陣列,需要三個的稱為三維陣列,以此類推。

2. 以下是一維、二維、三維陣列的宣告與建立方式,以整數陣列為例:
// 宣告並建立一個長度為 2 的一維陣列 int[] A = new int[2]; // 宣告並建立一個 2 x 3 的二維陣列 int[,] B = new int[2,3]; // 宣告並建立一個 2 x 3 x 4 的三維陣列 int[,,] C = new int[2,3,4];
3. 以下是一維、二維、三維陣列的使用方式,接續上一個例子:
// 將 A 中位置為 1 的值改成 10 A[1] = 10; // 將 B 中位置為 (1, 0) 的值改成 42 B[1, 0] = 42; // 將 C 中位置為 (0, 2, 1) 的值改成 25 C[0, 2, 1] = 25;
練習

基本題

1. 請依照課程中的指示,實作矩陣的加法與減法 (可以當作矩陣的大小都是 2 x 2)

2. 實作出一個顯示矩陣內容的 method,輸入一個矩陣,則會跳出一個 MessageBox 顯示矩陣的內容。

進階題

請依照課程中的指示,實作矩陣的乘法 (可以當作矩陣的大小都是 2 x 2)



可以使用以下例子來驗證



相關資訊連結

MSDN - 多維陣列

https://msdn.microsoft.com/zh-tw/library/2yd9wwz4.aspx

Wikipedia - 矩陣乘法

https://zh.wikipedia.org/wiki/%E7%9F%A9%E9%99%A3%E4%B9%98%E6%B3%95

9 則留言:

  1. 小山您好, 請問有矩陣相加的範例解答嗎?

    回覆刪除
    回覆
    1. 這邊提供您小弟的寫法參考交流一下
      private void button1_Click(object sender, EventArgs e)
      {
      int[,] a = new int[,] { { 5, 6 }, { 7, 8 } };
      int[,] b = new int[,] { { 1, 2 }, { 3, 4 } };
      MatrixAdd c = new MatrixAdd();
      c.matrixAdd(a, b); //相加函式
      }

      class MatrixAdd //相加函式 ※最上面要新增函式庫「using System.Windows.Forms」
      {
      int[,] c = new int[2,2];
      string result = "";
      public void matrixAdd(int[,] a, int[,] b)
      {
      for (int i = 0; i < 2; i++)
      {
      for (int j = 0; j < 2; j++)
      {
      c[i, j] = a[i, j] + b[i, j]; // 陣列C = 陣列A (+/-) 陣列B
      result += "(" + c[i, j] +")";
      }
      result += "\n";
      }
      MessageBox.Show(result); // 印出陣列的值
      }

      刪除
    2. 這邊提供您 在下的寫法
      參考交流一下

      //矩陣的乘法
      public void mul(int[,] a, int[,] b)
      {
      //暫存陣列 R[],用來存入計算結果
      int[,] R = new int[a.GetLength(0), a.GetLength(1)] ;

      if (a.GetLength(1) == b.GetLength(0))
      {
      for (int x = 0; x < a.GetLength(0); x++)
      {
      for (int y = 0; y < b.GetLength(0); y++)
      {
      for (int k = 0; k < a.GetLength(1); k++)
      {
      R[x, y] += a[x, k] * b[k, y];
      }
      }
      }
      }

      //將暫存陣列存入A陣列
      for (int x = 0; x < a.GetLength(0); x++)
      {
      for (int y = 0; y < a.GetLength(1); y++)
      {
      a[x, y] = R[x, y];
      }
      }


      }

      刪除
    3. 作者已經移除這則留言。

      刪除
    4. int[,] A = new int[2, 2] { { 5, 6 }, { 7, 8 } };//建立A陣列
      int[,] B = new int[2, 2] { { 1, 2 }, { 3, 4 } };//建立B陣列
      int[,] C = new int[2, 2];
      int[,] D = new int[2, 2];

      C[0, 0] = A[0, 0] + B[0, 0];
      C[0, 1] = A[0, 1] + B[0, 1];
      C[1, 0] = A[1, 0] + B[1, 0];
      C[1, 1] = A[1, 1] + B[1, 1];

      D[0, 0] = A[0, 0] * B[0, 0] + A[0, 1] * B[1, 0];
      D[0, 1] = A[0, 0] * B[0, 1] + A[0, 1] * B[1, 1];
      D[1, 0] = A[1, 0] * B[0, 0] + A[1, 1] * B[1, 0];
      D[1, 1] = A[1, 0] * B[0, 1] + A[1, 1] * B[1, 1];

      MessageBox.Show("[" + D[0, 0] + " " + D[0,1]+"\n"+" "+D[1,0]+" "+D[1,1]+"]");

      刪除
  2. 版主您好!小弟目前正使用c#在開發視窗程式,目前想寫一個可以控制電源供應器的視窗程式,因為電源供應器上有電流數值,我希望可以將供應器上的電流值寫入到EXCEL中,請問一下在窗型程式的架構下,有辦法這樣子做嗎?目前小弟我找到的方法好像是在別的開發架構下的方法,可否跟您討教一下,感謝!

    回覆刪除
  3. class Calculate
    {
    public static int[,] Addmatrix (int[,] a, int[,] b) //加法
    {
    int[,] C = new int[2, 2];

    for(int i = 0;i<= 1; i++){
    for (int j = 0; j <= 1; j++)
    {
    C[i,j] = a[i, j] + b[i, j];
    }
    }
    return C;
    }

    public static int[,] Submatrix (int[,] a, int[,] b) //減法
    {
    int[,] C = new int[2, 2];

    for (int i = 0; i <= 1; i++)
    {
    for (int j = 0; j <= 1; j++)
    {
    C[i, j] = a[i, j] - b[i, j];
    }
    }
    return C;
    }

    public static int[,] Multiplymatrix(int[,] a, int[,] b) //乘法
    {
    int[,] C = new int[2, 2];

    for (int i = 0; i <= 1; i++)
    {
    for (int j = 0; j <= 1; j++)
    {
    C[i, j] = a[i, 0] * b[0, j] + a[i, 1] * b[1, j];
    }
    }
    return C;
    }
    }

    private void button1_Click(object sender, EventArgs e)
    {
    int[,] A = new int[,] { { 5, 6 }, { 7, 8 } };
    int[,] B = new int[,] { { 1, 2 }, { 3, 4 } };

    string result = "";

    result += "ADD:\n";

    for (int i = 0; i <= 1; i++)
    {
    for (int j = 0; j <= 1; j++)
    {
    result += " " + Calculate.Addmatrix(A,B)[i,j];
    }
    result += "\n";
    }

    result += "\nSUB:\n";

    for (int i = 0; i <= 1; i++)
    {
    for (int j = 0; j <= 1; j++)
    {
    result += " " + Calculate.Submatrix(A, B)[i, j];
    }
    result += "\n";
    }
    result += "\nMutiply:\n";

    for (int i = 0; i <= 1; i++)
    {
    for (int j = 0; j <= 1; j++)
    {
    result += " " + Calculate.Multiplymatrix(A, B)[i, j];
    }
    result += "\n";
    }

    MessageBox.Show(result);

    }

    回覆刪除
  4. 老師您好
    我自己用以前數學寫了除法(求det再除)
    不過方法不是很聰明
    想問問看是否有可改進的地方
    以下為我的程式碼
    ==============================
    public void DIVIDE(int[,] a, int[,] b)
    {
    //A/B = A*B^-1
    //find det
    det = b[0, 0] * b[1, 1] - b[0, 1] * b[1, 0];
    //find B^-1
    for (int i = 0; i < 2; i++)
    {
    for (int j = 0; j < 2; j++)
    {
    c[i, j] = b[1 - j, 1 - i];
    }
    }
    c[0, 1] *= -1;
    c[1, 0] *= -1;
    for (int i = 0; i < 2; i++)
    {
    for (int j = 0; j < 2; j++)
    {
    c[i, j] = c[i,j] / det;
    }
    }
    //find A*B-1
    for (int i = 0; i < 2; i++)
    {
    for (int j = 0; j < 2; j++)
    {
    inv[i, j] = a[i, 0] * c[0, j] + a[i, 1] * c[1, j];
    result += "(" + inv[i, j] + ")";
    }
    result += "\n";
    }



    }

    回覆刪除
  5. 我的寫法乘法部分分享:
    int[,] A = new int[,] { { 5, 6 }, { 7, 8 } };
    int[,] B = new int[,] { { 1, 2 }, { 3, 4 } };
    int[,] C = new int[2, 2];
    string msg = "";

    for(int k=0; k<2;k++)
    {
    for (int i = 0; i < 2; i++)
    {
    for (int j = 0; j < 2; j++)
    {
    C[k, i]+= A[k, j] *B[j, i];

    }

    if (C[k, i] >= 10)
    msg += C[k, i] + " ";
    else
    msg += C[k, i] + " ";

    }

    msg += "\n";
    }

    MessageBox.Show(msg);

    回覆刪除