📄 form1.cs
字号:
//
// a22
//
this.a22.Location = new System.Drawing.Point(120, 80);
this.a22.Name = "a22";
this.a22.Size = new System.Drawing.Size(56, 16);
this.a22.TabIndex = 13;
//
// a21
//
this.a21.Location = new System.Drawing.Point(56, 80);
this.a21.Name = "a21";
this.a21.Size = new System.Drawing.Size(56, 16);
this.a21.TabIndex = 12;
//
// a112
//
this.a112.Location = new System.Drawing.Point(760, 56);
this.a112.Name = "a112";
this.a112.Size = new System.Drawing.Size(56, 16);
this.a112.TabIndex = 11;
//
// a111
//
this.a111.Location = new System.Drawing.Point(696, 56);
this.a111.Name = "a111";
this.a111.Size = new System.Drawing.Size(56, 16);
this.a111.TabIndex = 10;
//
// a110
//
this.a110.Location = new System.Drawing.Point(632, 56);
this.a110.Name = "a110";
this.a110.Size = new System.Drawing.Size(56, 16);
this.a110.TabIndex = 9;
//
// a19
//
this.a19.Location = new System.Drawing.Point(568, 56);
this.a19.Name = "a19";
this.a19.Size = new System.Drawing.Size(56, 16);
this.a19.TabIndex = 8;
//
// a18
//
this.a18.Location = new System.Drawing.Point(504, 56);
this.a18.Name = "a18";
this.a18.Size = new System.Drawing.Size(56, 16);
this.a18.TabIndex = 7;
//
// a17
//
this.a17.Location = new System.Drawing.Point(440, 56);
this.a17.Name = "a17";
this.a17.Size = new System.Drawing.Size(56, 16);
this.a17.TabIndex = 6;
//
// a16
//
this.a16.Location = new System.Drawing.Point(376, 56);
this.a16.Name = "a16";
this.a16.Size = new System.Drawing.Size(56, 16);
this.a16.TabIndex = 5;
//
// a15
//
this.a15.Location = new System.Drawing.Point(312, 56);
this.a15.Name = "a15";
this.a15.Size = new System.Drawing.Size(56, 16);
this.a15.TabIndex = 4;
//
// a14
//
this.a14.Location = new System.Drawing.Point(248, 56);
this.a14.Name = "a14";
this.a14.Size = new System.Drawing.Size(56, 16);
this.a14.TabIndex = 3;
//
// a13
//
this.a13.Location = new System.Drawing.Point(184, 56);
this.a13.Name = "a13";
this.a13.Size = new System.Drawing.Size(56, 16);
this.a13.TabIndex = 2;
//
// a12
//
this.a12.Location = new System.Drawing.Point(120, 56);
this.a12.Name = "a12";
this.a12.Size = new System.Drawing.Size(56, 16);
this.a12.TabIndex = 1;
//
// a11
//
this.a11.Location = new System.Drawing.Point(56, 56);
this.a11.Name = "a11";
this.a11.Size = new System.Drawing.Size(56, 16);
this.a11.TabIndex = 0;
//
// btnLook
//
this.btnLook.Location = new System.Drawing.Point(248, 24);
this.btnLook.Name = "btnLook";
this.btnLook.Size = new System.Drawing.Size(88, 24);
this.btnLook.TabIndex = 3;
this.btnLook.Text = "产生矩阵";
this.btnLook.Click += new System.EventHandler(this.btnLook_Click);
//
// btnResult
//
this.btnResult.Location = new System.Drawing.Point(408, 24);
this.btnResult.Name = "btnResult";
this.btnResult.Size = new System.Drawing.Size(112, 24);
this.btnResult.TabIndex = 4;
this.btnResult.Text = "相乘结果";
this.btnResult.Click += new System.EventHandler(this.btnResult_Click);
//
// lblTitle
//
this.lblTitle.Location = new System.Drawing.Point(216, 8);
this.lblTitle.Name = "lblTitle";
this.lblTitle.Size = new System.Drawing.Size(440, 32);
this.lblTitle.TabIndex = 144;
this.lblTitle.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
//
// Form1
//
this.AutoScaleBaseSize = new System.Drawing.Size(6, 14);
this.ClientSize = new System.Drawing.Size(864, 422);
this.Controls.Add(this.btnResult);
this.Controls.Add(this.btnLook);
this.Controls.Add(this.panel1);
this.Name = "Form1";
this.Text = "Strassen矩阵乘法";
this.panel1.ResumeLayout(false);
this.ResumeLayout(false);
}
#endregion
/// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main()
{
Application.Run(new Form1());
}
void ThreeMatrix(ref float a11,ref float a12,ref float a13,ref float a14,ref float a21,ref float a22,ref float a23,ref float a24,
ref float a31,ref float a32,ref float a33,ref float a34,ref float a41,ref float a42,ref float a43,ref float a44,
float b11,float b12,float b13,float b14,float b21,float b22,float b23,float b24,float b31,float b32,float b33,float b34,float b41,float b42,float b43,float b44,
float c11,float c12,float c13,float c14,float c21,float c22,float c23,float c24,float c31,float c32,float c33,float c34,float c41,float c42,float c43,float c44,
float d11,float d12,float d13,float d14,float d21,float d22,float d23,float d24,float d31,float d32,float d33,float d34,float d41,float d42,float d43,float d44,
float e11,float e12,float e13,float e14,float e21,float e22,float e23,float e24,float e31,float e32,float e33,float e34,float e41,float e42,float e43,float e44,
float f11,float f12,float f13,float f14,float f21,float f22,float f23,float f24,float f31,float f32,float f33,float f34,float f41,float f42,float f43,float f44)
//六个4×4子矩阵相乘
{
FourStrassen(ref a11,ref a12,ref a13,ref a14,ref a21,ref a22,ref a23,ref a24,ref a31,ref a32,ref a33,ref a34,ref a41,ref a42,ref a43,ref a44,
d11,d12,d13,d14,d21,d22,d23,d24,d31,d32,d33,d34,d41,d42,d43,d44); //两个4×4子矩阵相乘
FourStrassen(ref b11,ref b12,ref b13,ref b14,ref b21,ref b22,ref b23,ref b24,ref b31,ref b32,ref b33,ref b34,ref b41,ref b42,ref b43,ref b44,
e11,e12,e13,e14,e21,e22,e23,e24,e31,e32,e33,e34,e41,e42,e43,e44); //两个4×4子矩阵相乘
FourStrassen(ref c11,ref c12,ref c13,ref c14,ref c21,ref c22,ref c23,ref c24,ref c31,ref c32,ref c33,ref c34,ref c41,ref c42,ref c43,ref c44,
f11,f12,f13,f14,f21,f22,f23,f24,f31,f32,f33,f34,f41,f42,f43,f44); //两个4×4子矩阵相乘
a11 = a11+b11+c11; a12 = a12+b12+c12; a13 = a13+b13+c13;a14 = a14+b14+c14; //保存六个4×4矩阵相乘结果的元素
a21 = a21+b21+c21; a22 = a22+b22+c22; a23 = a23+b23+c23;a24 = a24+b24+c24;
a31 = a31+b31+c31; a32 = a32+b32+c32; a33 = a33+b33+c33;a34 = a34+b34+c34;
a41 = a41+b41+c41; a42 = a42+b42+c42; a43 = a43+b43+c43;a44 = a44+b44+c44;
}
void FourStrassen(ref float a11,ref float a12,ref float a13,ref float a14,ref float a21,ref float a22,ref float a23,ref float a24,
ref float a31,ref float a32,ref float a33,ref float a34,ref float a41,ref float a42,ref float a43,ref float a44,
float b11,float b12,float b13,float b14,float b21,float b22,float b23,float b24,float b31,float b32,float b33,float b34,float b41,float b42,float b43,float b44)
//两个4×4子矩阵相乘,把4×4矩阵分为4个大小相等的2×2子矩阵
{
float m111,m112,m121,m122,m211,m212,m221,m222,m311,m312,m321,m322,m411,m412,m421,m422,m511,m512,m521,m522,m611,m612,m621,m622,m711,m712,m721,m722;
m111 = a11; m112 = a12; m121 = a21; m122 = a22; //把8次相乘减少到7次相乘
m211 = a11+a13; m212 = a12+a14; m221 = a21+a23; m222 = a22+a24;
m311 = a31+a33; m312 = a32+a34; m321 = a41+a43; m322 = a42+a44;
m411 = a33; m412 = a34; m421 = a43; m422 = a44;
m511 = a11+a33; m512 = a12+a34; m521 = a21+a43; m522 = a22+a44;
m611 = a13-a33; m612 = a14-a34; m621 = a23-a43; m622 = a24-a44;
m711 = a11-a31; m712 = a12-a32; m721 = a21-a41; m722 = a22-a42;
TwoStrassen(ref m111,ref m112,ref m121,ref m122,b13-b33,b14-b34,b23-b43,b24-b44); //两个2×2子矩阵相乘
TwoStrassen(ref m211,ref m212,ref m221,ref m222,b33,b34,b43,b44);
TwoStrassen(ref m311,ref m312,ref m321,ref m322,b11,b12,b21,b22);
TwoStrassen(ref m411,ref m412,ref m421,ref m422,b31-b11,b32-b12,b41-b21,b42-b22);
TwoStrassen(ref m511,ref m512,ref m521,ref m522,b11+b33,b12+b34,b21+b43,b22+b44);
TwoStrassen(ref m611,ref m612,ref m621,ref m622,b31+b33,b32+b34,b41+b43,b43+b44);
TwoStrassen(ref m711,ref m712,ref m721,ref m722,b11+b13,b12+b14,b21+b23,b22+b24);
a11 = m511+m411-m211+m611; a12 = m512+m412-m212+m612; a21 = m521+m421-m221+m621; a22 = m522+m422-m222+m622;
a13 = m111+m211; a14 = m112+m212; a23 = m121+m221; a24 = m122+m222; //保存4×4矩阵相乘结果的元素
a31 = m311+m411; a32 = m312+m412; a41 = m321+m421; a42 = m322+m422;
a33 = m511+m111-m311-m711; a34 = m512+m112-m312-m712; a43 = m521+m121-m321-m721; a44 = m522+m122-m322-m722;
}
void TwoStrassen(ref float a11,ref float a12,ref float a21,ref float a22,float b11,float b12,float b21,float b22) //2×2矩阵相乘
{
float m1,m2,m3,m4,m5,m6,m7; //把8次相乘减少到7次相乘
m1 = a11*(b12-b22);
m2 = (a11+a12)*b22;
m3 = (a21+a22)*b11;
m4 = a22*(b21-b11);
m5 = (a11+a22)*(b11+b22);
m6 = (a12-a22)*(b21+b22);
m7 = (a11-a21)*(b11+b12);
a11 = m5+m4-m2+m6;
a12 = m1+m2;
a21 = m3+m4;
a22 = m5+m1-m3-m7;
}
private void btnLook_Click(object sender, System.EventArgs e) //产生12阶矩阵
{
float[,] a = new float[13,13]; //保存12阶矩阵元素
for (int i=1; i<=12; i++) //产生12阶矩阵元素
{
for (int j=1; j<=12; j++)
{
a[i,j] = (float)1/(float)(i+j-1); //保留小数点后面6位
int x=(int)(a[i,j]*1000000);
a[i,j]=(float)x/(float)1000000;
}
}
lblTitle.Text = "12阶矩阵如下:";
a11.Text = a[1,1].ToString();a12.Text = a[1,2].ToString();a13.Text = a[1,3].ToString();a14.Text = a[1,4].ToString(); //保存12阶矩阵元素
a15.Text = a[1,5].ToString();a16.Text = a[1,6].ToString();a17.Text = a[1,7].ToString();a18.Text = a[1,8].ToString();
a19.Text = a[1,9].ToString();a110.Text = a[1,10].ToString();a111.Text = a[1,11].ToString();a112.Text = a[1,12].ToString();
a21.Text = a[2,1].ToString();a22.Text = a[2,2].ToString();a23.Text = a[2,3].ToString();a24.Text = a[2,4].ToString();
a25.Text = a[2,5].ToString();a26.Text = a[2,6].ToString();a27.Text = a[2,7].ToString();a28.Text = a[2,8].ToString();
a29.Text = a[2,9].ToString();a210.Text = a[2,10].ToString();a211.Text = a[2,11].ToString();a212.Text = a[2,12].ToString();
a31.Text = a[3,1].ToString();a32.Text = a[3,2].ToString();a33.Text = a[3,3].ToString();a34.Text = a[3,4].ToString();
a35.Text = a[3,5].ToString();a36.Text = a[3,6].ToString();a37.Text = a[3,7].ToString();a38.Text = a[3,8].ToString();
a39.Text = a[3,9].ToString();a310.Text = a[3,10].ToString();a311.Text = a[3,11].ToString();a312.Text = a[3,12].ToString();
a41.Text = a[4,1].ToString();a42.Text = a[4,2].ToString();a43.Text = a[4,3].ToString();a44.Text = a[4,4].ToString();
a45.Text = a[4,5].ToString();a46.Text = a[4,6].ToString();a47.Text = a[4,7].ToString();a48.Text = a[4,8].ToString();
a49.Text = a[4,9].ToString();a410.Text = a[4,10].ToString();a411.Text = a[4,11].ToString();a412.Text = a[4,12].ToString();
a51.Text = a[5,1].ToString();a52.Text = a[5,2].ToString();a53.Text = a[5,3].ToString();a54.Text = a[5,4].ToString();
a55.Text = a[5,5].ToString();a56.Text = a[5,6].ToString();a57.Text = a[5,7].ToString();a58.Text = a[5,8].ToString();
a59.Text = a[5,9].ToString();a510.Text = a[5,10].ToString();a511.Text = a[5,11].ToString();a512.Text = a[5,12].ToString();
a61.Text = a[6,1].ToString();a62.Text = a[6,2].ToString();a63.Text = a[6,3].ToString();a64.Text = a[6,4].ToString();
a65.Text = a[6,5].ToString();a66.Text = a[6,6].ToString();a67.Text = a[6,7].ToString();a68.Text = a[6,8].ToString();
a69.Text = a[6,9].ToString();a610.Text = a[6,10].ToString();a611.Text = a[6,11].ToString();a612.Text = a[6,12].ToString();
a71.Text = a[7,1].ToString();a72.Text = a[7,2].ToString();a73.Text = a[7,3].ToString();a74.Text = a[7,4].ToString();
a75.Text = a[7,5].ToString();a76.Text = a[7,6].ToString();a77.Text = a[7,7].ToString();a78.Text = a[7,8].ToString();
a79.Text = a[7,9].ToString();a710.Text = a[7,10].ToString();a711.Text = a[7,11].ToString();a712.Text = a[7,12].ToString();
a81.Text = a[8,1].ToString();a82.Text = a[8,2].ToString();a83.Text = a[8,3].ToString();a84.Text = a[8,4].ToString();
a85.Text = a[8,5].ToString();a86.Text = a[8,6].ToString();a87.Text = a[8,7].ToString();a88.Text = a[8,8].ToString();
a89.Text = a[8,9].ToString();a810.Text = a[8,10].ToString();a811.Text = a[8,11].ToString();a812.Text = a[8,12].ToString();
a91.Text = a[9,1].ToString();a92.Text = a[9,2].ToString();a93.Text = a[9,3].ToString();a94.Text = a[9,4].ToString();
a95.Text = a[9,5].ToString();a96.Text = a[9,6].ToString();a97.Text = a[9,7].ToString();a98.Text = a[9,8].ToString();
a99.Text = a[9,9].ToString();a910.Text = a[9,10].ToString();a911.Text = a[9,11].ToString();a912.Text = a[9,12].ToString();
a1001.Text = a[10,1].ToString();a1002.Text = a[10,2].ToString();a1003.Text = a[10,3].ToString();a1004.Text = a[10,4].ToString();
a1005.Text = a[10,5].ToString();a1006.Text = a[10,6].ToString();a1007.Text = a[10,7].ToString();a1008.Text = a[10,8].ToString();
a1009.Text = a[10,9].ToString();a1010.Text = a[10,10].ToString();a1011.Text = a[10,11].ToString();a1012.Text = a[10,12].ToString();
a1101.Text = a[11,1].ToString();a1102.Text = a[11,2].ToString();a1103.Text = a[11,3].ToString();a1104.Text = a[11,4].ToString();
a1105.Text = a[11,5].ToString();a1106.Text = a[11,6].ToString();a1107.Text = a[11,7].ToString();a1108.Text = a[11,8].ToString();
a1109.Text = a[11,9].ToString();a1110.Text = a[11,10].ToString();a1111.Text = a[11,11].ToString();a1112.Text = a[11,12].ToString();
a1201.Text = a[12,1].ToString();a1202.Text = a[12,2].ToString();a1203.Text = a[12,3].ToString();a1204.Text = a[12,4].ToString();
a1205.Text = a[12,5].ToString();a1206.Text = a[12,6].ToString();a1207.Text = a[12,7].ToString();a1208.Text = a[12,8].ToString();
a1209.Text = a[12,9].ToString();a1210.Text = a[12,10].ToString();a1211.Text = a[12,11].ToString();a1212.Text = a[12,12].ToString();
}
private void btnResult_Click(object sender, System.EventArgs e) //两个12阶矩阵相乘
{
float[,] a = new float[13,13]; //12阶矩阵元素
float[,] b = new float[13,13]; //中间变量,保存12阶矩阵元素
float[,] c = new float[13,13]; //12阶矩阵相乘结果元素
for (int i=1; i<=12; i++) //产生12阶矩阵元素
{
for (int j=1; j<=12; j++)
{
a[i,j] = (float)1/(float)(i+j-1);
int x=(int)(a[i,j]*1000000); //保留小数点后面6位
a[i,j]=(float)x/(float)1000000;
}
}
for (int i=1; i<=12; i++) //中间变量,保存12阶矩阵元素
{
for (int j=1; j<=12; j++)
{
b[i,j] = a[i,j];
}
}
ThreeMatrix(ref b[1,1],ref b[1,2],ref b[1,3],ref b[1,4],ref b[2,1],ref b[2,2],ref b[2,3],ref b[2,4],
ref b[3,1],ref b[3,2],ref b[3,3],ref b[3,4],ref b[4,1],ref b[4,2],ref b[4,3],ref b[4,4],
b[1,5],b[1,6],b[1,7],b[1,8],b[2,5],b[2,6],b[2,7],b[2,8],b[3,5],b[3,6],b[3,7],b[3,8],b[4,5],b[4,6],b[4,7],b[4,8],
b[1,9],b[1,10],b[1,11],b[1,12],b[2,9],b[2,10],b[2,11],b[2,12],b[3,9],b[3,10],b[3,11],b[3,12],b[4,9],b[4,10],b[4,11],b[4,12],
a[1,1],a[1,2],a[1,3],a[1,4],a[2,1],a[2,2],a[2,3],a[2,4],a[3,1],a[3,2],a[3,3],a[3,4],a[4,1],a[4,2],a[4,3],a[4,4],
a[5,1],a[5,2],a[5,3],a[5,4],a[6,1],a[6,2],a[6,3],a[6,4],a[7,1],a[7,2],a[7,3],a[7,4],a[8,1],a[8,2],a[8,3],a[8,4],
a[9,1],a[9,2],a[9,3],a[9,4],a[10,1],a[10,2],a[10,3],a[10,4],a[11,1],a[11,2],a[11,3],a[11,4],a[12,1],a[12,2],a[12,3],a[12,4]);
//六个4×4子矩阵相乘
for (int i=1; i<=4; i++) //保存六个4×4子矩阵相乘的结果
{
for (int j=1; j<=4; j++)
{
c[i,j] = b[i,j];
}
}
for (int i=1; i<=12; i++) //将b[i,j]还原成a[i,j]
{
for (int j=1; j<=12; j++)
{
b[i,j] = a[i,j];
}
}
ThreeMatrix(ref b[1,1],ref b[1,2],ref b[1,3],ref b[1,4],ref b[2,1],ref b[2,2],ref b[2,3],ref b[2,4],
ref b[3,1],ref b[3,2],ref b[3,3],ref b[3,4],ref b[4,1],ref b[4,2],ref b[4,3],ref b[4,4],
b[1,5],b[1,6],b[1,7],b[1,8],b[2,5],b[2,6],b[2,7],b[2,8],b[3,5],b[3,6],b[3,7],b[3,8],b[4,5],b[4,6],b[4,7],b[4,8],
b[1,9],b[1,10],b[1,11],b[1,12],b[2,9],b[2,10],b[2,11],b[2,12],b[3,9],b[3,10],b[3,11],b[3,12],b[4,9],b[4,10],b[4,11],b[4,12],
a[1,5],a[1,6],a[1,7],a[1,8],a[2,5],a[2,6],a[2,7],a[2,8],a[3,5],a[3,6],a[3,7],a[3,8],a[4,5],a[4,6],a[4,7],a[4,8],
a[5,5],a[5,6],a[5,7],a[5,8],a[6,5],a[6,6],a[6,7],a[6,8],a[7,5],a[7,6],a[7,7],a[7,8],a[8,5],a[8,6],a[8,7],a[8,8],
a[9,5],a[9,6],a[9,7],a[9,8],a[10,5],a[10,6],a[10,7],a[10,8],a[11,5],a[11,6],a[11,7],a[11,8],a[12,5],a[12,6],a[12,7],a[12,8]);
for (int i=1; i<=4; i++)
{
for (int j=1; j<=4; j++)
{
c[i,j+4] = b[i,j];
}
}
for (int i=1; i<=12; i++)
{
for (int j=1; j<=12; j++)
{
b[i,j] = a[i,j];
}
}
ThreeMatrix(ref b[1,1],ref b[1,2],ref b[1,3],ref b[1,4],ref b[2,1],ref b[2,2],ref b[2,3],ref b[2,4],
ref b[3,1],ref b[3,2],ref b[3,3],ref b[3,4],ref b[4,1],ref b[4,2],ref b[4,3],ref b[4,4],
b[1,5],b[1,6],b[1,7],b[1,8],b[2,5],b[2,6],b[2,7],b[2,8],b[3,5],b[3,6],b[3,7],b[3,8],b[4,5],b[4,6],b[4,7],b[4,8],
b[1,9],b[1,10],b[1,11],b[1,12],b[2,9],b[2,10],b[2,11],b[2,12],b[3,9],b[3,10],b[3,11],b[3,12],b[4,9],b[4,10],b[4,11],b[4,12],
a[1,9],a[1,10],a[1,11],a[1,12],a[2,9],a[2,10],a[2,11],a[2,12],a[3,9],a[3,10],a[3,11],a[3,12],a[4,9],a[4,10],a[4,11],a[4,12],
a[5,9],a[5,10],a[5,11],a[5,12],a[6,9],a[6,10],a[6,11],a[6,12],a[7,9],a[7,10],a[7,11],a[7,12],a[8,9],a[8,10],a[8,11],a[8,12],
a[9,9],a[9,10],a[9,11],a[9,12],a[10,9],a[10,10],a[10,11],a[10,12],a[11,9],a[11,10],a[11,11],a[11,12],a[12,9],a[12,10],a[12,11],a[12,12]);
for (int i=1; i<=4; i++)
{
for (int j=1; j<=4; j++)
{
c[i,j+8] = b[i,j];
}
}
for (int i=1; i<=12; i++)
{
for (int j=1; j<=12; j++)
{
b[i,j] = a[i,j];
}
}
ThreeMatrix(ref b[5,1],ref b[5,2],ref b[5,3],ref b[5,4],ref b[6,1],ref b[6,2],ref b[6,3],ref b[6,4],
ref b[7,1],ref b[7,2],ref b[7,3],ref b[7,4],ref b[8,1],ref b[8,2],ref b[8,3],ref b[8,4],
b[5,5],b[5,6],b[5,7],b[5,8],b[6,5],b[6,6],b[6,7],b[6,8],b[7,5],b[7,6],b[7,7],b[7,8],b[8,5],b[
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -