之前在 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
小山您好, 請問有矩陣相加的範例解答嗎?
回覆刪除這邊提供您小弟的寫法參考交流一下
刪除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); // 印出陣列的值
}
這邊提供您 在下的寫法
刪除參考交流一下
//矩陣的乘法
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];
}
}
}
作者已經移除這則留言。
刪除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]+"]");
版主您好!小弟目前正使用c#在開發視窗程式,目前想寫一個可以控制電源供應器的視窗程式,因為電源供應器上有電流數值,我希望可以將供應器上的電流值寫入到EXCEL中,請問一下在窗型程式的架構下,有辦法這樣子做嗎?目前小弟我找到的方法好像是在別的開發架構下的方法,可否跟您討教一下,感謝!
回覆刪除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);
}
老師您好
回覆刪除我自己用以前數學寫了除法(求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";
}
}
我的寫法乘法部分分享:
回覆刪除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);