PDA

View Full Version : ماتریس استراسن



vahidkashefian
شنبه 18 اردیبهشت 1389, 09:00 صبح
با سلام

دوستان من برای تکمیل پروژه ای باید ضرب ماتریس استراسن رو ارائه بدم ولی با این تفاوت که اطلاعات رو از یک فایل بخونه سورس رو که با C# هست دارم ولی نمیدونم چگونه اطلاعات لازم رو بره از فایل بخونه؟

مرسی
:بوس:


using System;
using System.Collections.Generic;
using System.Text;

namespace ConsoleApplication1
{
class Program
{
////////////////////// zarbe mamoli matrix////////////////////
static int[,] compute(int n, int[,] matrix_A, int[,] matrix_B)
{
int i, j, k;
int[,] matrix_C = new int[n, n];
for (i = 0; i < n; i++)
for (j = 0; j < n; j++)
{
matrix_C[i, j] = 0;
for (k = 0; k < n; k++)
matrix_C[i, j] = matrix_C[i, j] + matrix_A[i, k] * matrix_B[k, j];
}
return matrix_C;
}
////////////////////// jaame matrix////////////////////
static int[,] sum(int n, int[,] matrix_A, int[,] matrix_B)
{
int[,] matrix_C = new int[n, n];
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++)
matrix_C[i, j] = matrix_A[i, j] + matrix_B[i, j];
return matrix_C;
}
//////////////// tafrighe marix/////////////////////
static int[,] sub(int n, int[,] matrix_A, int[,] matrix_B)
{
int[,] matrix_C = new int[n, n];
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++)
matrix_C[i, j] = matrix_A[i, j] - matrix_B[i, j];
return matrix_C;
}

static int[,] strassen(int n, int[,] matrix_A, int[,] matrix_B)
{
int i, j;
if (n == 1)
return compute(n, matrix_A, matrix_B);
else
{
int[,] A11 = new int[n / 2, n / 2];
int[,] A12 = new int[n / 2, n / 2];
int[,] A21 = new int[n / 2, n / 2];
int[,] A22 = new int[n / 2, n / 2];
int[,] B11 = new int[n / 2, n / 2];
int[,] B12 = new int[n / 2, n / 2];
int[,] B21 = new int[n / 2, n / 2];
int[,] B22 = new int[n / 2, n / 2];
int[,] M1 = new int[n / 2, n / 2];
int[,] M2 = new int[n / 2, n / 2];
int[,] M3 = new int[n / 2, n / 2];
int[,] M4 = new int[n / 2, n / 2];
int[,] M5 = new int[n / 2, n / 2];
int[,] M6 = new int[n / 2, n / 2];
int[,] M7 = new int[n / 2, n / 2];
int[,] t1 = new int[n / 2, n / 2], t2 = new int[n / 2, n / 2];
int[,] t3 = new int[n / 2, n / 2], t4 = new int[n / 2, n / 2];
for (i = 0; i < n / 2; i++)
for (j = 0; j < n / 2; j++)
{
A11[i, j] = matrix_A[i, j];
A12[i, j] = matrix_A[i, j + n / 2];
A21[i, j] = matrix_A[i + n / 2, j];
A22[i, j] = matrix_A[i + n / 2, j + n / 2];
B11[i, j] = matrix_B[i, j];
B12[i, j] = matrix_B[i, j + n / 2];
B21[i, j] = matrix_B[i + n / 2, j];
B22[i, j] = matrix_B[i + n / 2, j + n / 2];
}

t1 = sum(n / 2, A11, A22);
t2 = sum(n / 2, B11, B22);
M1 = strassen(n / 2, t1, t2);
t1 = sum(n / 2, A21, A22);
M2 = strassen(n / 2, t1, B11);
t1 = sub(n / 2, B12, B22);
M3 = strassen(n / 2, A11, t1);
t1 = sub(n / 2, B21, B11);
M4 = strassen(n / 2, A22, t1);
t2 = sum(n / 2, A11, A12);
M5 = strassen(n / 2, t2, B22);
t1 = sub(n / 2, A21, A11);
t2 = sum(n / 2, B11, B22);
M6 = strassen(n / 2, t1, t2);
t1 = sub(n / 2, A12, A22);
t2 = sum(n / 2, B21, B22);
M7 = strassen(n / 2, t1, t2);
t1 = sum(n / 2, sub(n / 2, sum(n / 2, M1, M4), M5), M7);
t2 = sum(n / 2, M3, M5);
t3 = sum(n / 2, M2, M4);
t4 = sum(n / 2, sub(n / 2, sum(n / 2, M1, M3), M2), M6);
//////////////// natije ra halghe for zir dar matrix C mirizad////////////
int[,] matrix_C = new int[n, n];
for (i = 0; i < n / 2; i++)
for (j = 0; j < n / 2; j++)
{
matrix_C[i, j] = 0;
matrix_C[i, j] = t1[i, j];
matrix_C[i, j + n / 2] = 0;
matrix_C[i, j + n / 2] = t2[i, j];
matrix_C[i + n / 2, j] = 0;
matrix_C[i + n / 2, j] = t3[i, j];
matrix_C[i + n / 2, j + n / 2] = 0;
matrix_C[i + n / 2, j + n / 2] = t4[i, j];
}
return matrix_C;
}
}
static void print_matrix(int[,] matrix_A, int n)
{
int i, j;
for (i = 0; i < n; i++)
{
for (j = 0; j < n; j++)
Console.Write(matrix_A[i, j] + " ");
Console.WriteLine();
}
}
static void read_matrix(int[,] matrix_A, int n)
{
int i, j;
for (i = 0; i < n; i++)
for (j = 0; j < n; j++)
{
Console.Write(i.ToString() + "." + j.ToString() + ":");
matrix_A[i, j] = int.Parse(Console.ReadLine());
}

}
static void Main(string[] args)
{
int n=0;
/////// vared kardan matrix ha in while faghat matrix [2^N] ra magirad////////////////
while (n==0)
{
Console.Clear();
Console.Write("Lotfan Abade Matrix Ra Vared Konid [2^N] : ");
n = int.Parse(Console.ReadLine());
int x=Convert.ToInt32(Math.Log(n,2.0));;
if (n == Math.Pow(2, x))
{
Console.Clear();
break;
}
else
{
Console.Clear();
Console.WriteLine("Abaade matrix [2^N] nist! Baraie edame Kelidi ra feshar dahid. ");
n=0;
Console.ReadKey();
}
}
int[,] matrix_A = new int[n, n];
int[,] matrix_B = new int[n, n];
int[,] matrix_C = new int[n, n];
Console.WriteLine("Matrix A Ra Vared Konid : ");
read_matrix(matrix_A, n);
Console.WriteLine("Matrix B Ra Vared Konid : ");
read_matrix(matrix_B, n);
Console.WriteLine("-------------------------\n");
Console.WriteLine("Normal Algorithm\n");
matrix_C = compute(n, matrix_A, matrix_B);
print_matrix(matrix_C, n);
Console.WriteLine("\n-------------------------\n");
Console.WriteLine("Strassen Algorithm\n");
matrix_C = strassen(n, matrix_A, matrix_B);
print_matrix(matrix_C, n);
Console.ReadKey();
}
}
}

cardano7
شنبه 18 اردیبهشت 1389, 14:04 عصر
سلام
شما اول تعیین کنید که یک ماتریس با چه آرایشی قراره که در حافظه ذخیره بشه؟(نحوه ی سریالیزیشن اون چه جوریه)

vahidkashefian
پنج شنبه 27 خرداد 1389, 12:48 عصر
کد سی شارپشو دارم میخام یه فرم طراحی کنم کد رو بذارم پشتش که اجرا میشه مثلا جای ورود عدد داشته باشه و از اینا