الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

التعامل مع المصفوفات المنطقية

بدأه justalayoubi في 11 مايو 2012 · 40 رد · 3,254 مشاهدة · في الأسئلة المجابة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم ورحمه الله .... جمعة مباركه علي الجميع

اخوتي طلب مني برنامج بلغه ++c علي المصفوفات البولينيه boolean matrix , مثلاً إذا كان

1 A = 0 0

1 1 0

B = 1 1 1

1 1 1

0 0 0

من ثم الخرج يكون X

X = 1 1 1

1 1 1

علي حسب فهمي للمساله :wink: : اوجدت منقول المصفوفه A و من ثم ضربتها في معكوس المصفوفه B واخيرا حسبت معكوس الناتج و كانت النتيجه قيم X :wacko:

ومنها كتبت برنامجي ولكن لايعمل :sad:

اتمني ان اجد المساعده في البرنامج ولكم مني كل الشكر والتقدير وجزاكم الله الف خير

وهذا هو البرنامج :=

 #include <cstdlib>
#include <cstdio>
#include<iostream>


using namespace std;

#define MAX 10

void transpose(float *A, int m, int n);
void inverse(float *AT, int ra, int ca);
void multiply(
              int* A, //first matrix 
              int ra, //first matrix rows 
              int* B, //second matrix 
              int cb, //second matrix columns 
              int sh, //SHARED DIMENSION as 'first' columns and 'second' rows MUST BE THE SAME 
              int* X //to store the result
              );

void get_mat(float *m, int &X, int &c); 
void disp(float* m, int X, int c);
void multiply(float* AI, int ra, float* B, int cb, int sh, float* X); 
float a[10][10];
float b[10][10];
float c[10][10];

int main()
{
    float *A, *AI, *AT, *B, *X;
    int ra, ca; // rows and columns for matrix ai
    int rb, cb; // rows and columns for matrix b
    int i, j;
    cout << "First matrix size(rows columns) = ";
    cin >> ra >> ca;

    cout << "Second matrix size(rows columns) = ";
    cin >> rb >> cb;

    //if (ca != rb){
    //  cout << "Error: The matrices cannot be multilplied, size mismatch.";
    //  return 0;  
    //}

    A = new float[ra * ca];
    AT = new float[ra * ca];
    AI = new float[ra * ca];
    B = new float[rb * cb]; 
    X = new float[ra * cb]; 


    get_mat(A, ra, ca);
    get_mat(B, rb, cb);
    cout << "Original matrix\n";
    disp(A, ra, ca);


    for (i = 0; i < ca; i++)
        for (j = 0; j < ra; j++)
        {
            a[j] = A[ca * i + j];
            cout << a[j] << "\n";

        }

    //TRANSPOSE         
    transpose(A, ra, ca);

    cout << "Transposed matrix\n";

    for (i = 0; i < ca; i++)
        for (j = 0; j < ra; j++)
        {
            AT[ca * i + j] = a[j];
            cout << AT[ca * i + j] << "\n";

        }
    //INVERSE
    inverse(AT, ra, ca);

    cout << "Inverse matrix\n";

    for (i = 0; i < ca; i++)
        for (j = 0; j < ra; j++)
        {
            AI[ca * i + j] = b[j];
            cout << AI[ca * i + j] << "\n";


        }
    //MULTIPLY

    multiply(AI, ra, B, cb, ca, X);    

    cout << "\n\nResult = \n";
    disp(X, ra, cb);
    cout << "\nResult Transpose = \n";
    disp(AT, ra, ca);
    cout << "\nResult Inverse = \n";
    disp(AI, ra, ca);

    cout << "Press any key to exit...";
     // getch();
    delete[] A;
    delete[] AT;
    delete[] AI;


    return 0;
}

void transpose(float *A, int m, int n)
{
    int i, j;

    for (i = 0; i < n; i++)
        for (j = 0; j < m; j++)
        {
            a[j] = A[n * i + j];
            cout << a[j] << "\n";
        }

    cout << endl << "Displaying Matrix Transpose: " << endl << endl;
    for (i = 0; i < m; i++)
    {
        for (j = 0; j < n; j++)
        {
            cout << a[j] << " ";
        }
        cout << endl << endl;
    }


	getch();
}

void inverse(float *AT, int ra, int ca)
{

    float d, m;
    int i, j, k;

    for (i = 0; i < ra; i++)
        for (j = 0; j < ca; j++)
        {
            a[j] = AT[ca * i + j];
            cout << a[j] << "\n";
        }


    for (i = 0; i < ca; i++)
    {
        for (j = 0; j < ra; j++)
        {
            if (i == j)
                b[j] = 1;
            else
                b[j] = 0;
        }
    }

    if (a[0][0] == 0)
    {
        for (j = 0; j < ca; j++)
        {
            c[0][j] = b[1][j];
            c[0][j] = a[1][j];
            a[1][j] = a[0][j];
            a[0][j] = c[0][j];
            b[1][j] = b[0][j];
            b[0][j] = c[0][j];
        }
    }

    for (i = 0; i < ca; i++)
    {
        d = a;

        for (j = 0; j < ra; j++)
        {
            a[j] = a[j] / d;
            b[j] = b[j] / d;
        }

        for (k = 0; k < ca; k++)
        {
            if (k != i)
            {
                m = a[k];
                for (j = 0; j < ra; j++)
                {
                    a[k][j] = a[k][j]-(a[j] * m);
                    b[k][j] = b[k][j]-(b[j] * m);
                }
            }
        }
    }

    cout << "\nInverse of matrix is:\n"; 
    for (i = 0; i < ca; i++)
    {
        for (j = 0; j < ra; j++)
            printf(" %f ", b[j]);

        printf("\n");

    }

	getch();
}

void get_mat(float *m, int &X, int &c)
{
    cout << "Enter [" << X << "x" << c << "] Matrix :\n";
    for (int i = 0; i < X * c; i++)
        cin >> m;
}

void multiply(float* AI, int ra, float* B, int cb, int sh, float* X)
{
    for (int i = 0; i < ra * cb; ++i)
    {
        X = 0;
        for (int j = 0; j < sh; ++j)
            X += AI[(i / cb) * sh + j] * B[i % cb + j * cb];
        if (X > 1)
        {
            X = 1;
        }
    }
}

void disp(float* m, int X, int c)
{
    for (int i = 0; i < X * c; i++)
    {
        !(i % c) && cout << endl;
        cout << m << '\t';
    }
    cout << endl;
}
//getchar();
//getchar();  
          = ';

تم تعديل هذه المشاركة بواسطة أحمد الشنقيطي في 30 يونيو 2012 في 22:17 — السبب: تعديل العنوان

#2

يجي من يساعدك ان شاء الله

#3

اتمني ذلك فأنا والله في اشد الحوجه لتصحيح هذا البرنامج ( يؤثر ذلك علي مصير دراستي)

#4
اقتباس
علي حسب فهمي للمساله :wink: : اوجدت منقول المصفوفه A و من ثم ضربتها في معكوس المصفوفه B واخيرا حسبت معكوس الناتج و كانت النتيجه قيم X :wacko:

أين المسألة الاصلية؟ حتى يتمكن الاعضاء من مساعدتك. أن شاء الله لأن المشكلة قد تكون بسيطة للغاية

post-15367-027053900%201340345097.gifpost-15367-087183200%201340344597.gif
post-247365-0-10080400-1379403554_thumb.

#5

المسأله :

اكتب برنامج بلغه ++c يمثل المصفوفات البولينيه بحيث يكون الدخل A , B والخرج X ( في بدايه المسأله ذكرت قيم كل من A, B , X )

#6

السلام عليكم

اقتباس
علي حسب فهمي للمساله :wink: : اوجدت منقول المصفوفه A و من ثم ضربتها في معكوس المصفوفه B واخيرا حسبت معكوس الناتج و كانت النتيجه قيم X :wacko:

لا يمكن تخمين صيغة السؤال !! بل يجب أن يكون واضحا .. لأنه ببساطة يمكننا الحصول على المصفوفة X بأكثر من طريقة :)

تم تعديل هذه المشاركة بواسطة أحمد الشنقيطي في 11 مايو 2012 في 22:32

#7

المسأله ذكرت نظرياً فقط :-

و مضمونها ان الخرج (X) يساوي معكوس مضروب مصفوفتين , بحيث ان احدي المصفوفتين تساوي منقول مصفوفه الدخل الاولي والمصفوفه الاخري تساوي معكوس المصفوفه الثانيه

اي :-

اذا كان الدخل A , B فإن الخرج X تساوي معكوس (منقول A * معكوس B ) :wacko:

#8

هممممم تقصد Transpose(A) * Inverse(B)

لم افهم هل تقصد ان كودك خاطئ؟ ارجوك لا تقل لي انك تريد تصحيح للكود كامل ، حدد الجزئيات التي تصعب عليك

يمكن ان اساعدك، لاني لقد قمت بتطبيق عمليات الضرب والمقلوب بالمصفوفات من قبل ولكن الامر ممل نوعا ما بالنسبة لي كما انك تستطيع الحصول على حلول مثل هذه المشاكل من غوغل

بل ان هناك مكتبات numerical analysis كثيره جاهزه للاستخدام

تحياتي

تم تعديل هذه المشاركة بواسطة mental-driller في 11 مايو 2012 في 23:57

No intellectual battle was ever won through retreat
You do not watch Gintama? Dude, you are missing a lot!


صورةmsrgb1485.gif ocajavase7programmerclr.gif

#9

للأسف حقاً اريد تصحيح للكود كاملاً :sad:

اما بالنسبه للبحث في قوقل فلدي مشكله في اللغه الانجليزيه ممايصعب علي البحث و الاستفاده الكامله (هذا الكلام بعد تجربه في البحث)

#10

ارجوك ساعدني ... والله هذا لتقييم عمل فصل دراسي :cry: ( كان الله في عون العبد مادام العبد في عون اخيه)

#11
justalayoubi كتب:

السلام عليكم ورحمه الله .... جمعة مباركه علي الجميع

اخوتي طلب مني برنامج بلغه ++c علي المصفوفات البولينيه boolean matrix , مثلاً إذا كان

1 A = 0 0

1 1 0

B = 1 1 1

1 1 1

0 0 0

من ثم الخرج يكون X

X = 1 1 1

1 1 1

علي حسب فهمي للمساله :wink: : اوجدت منقول المصفوفه A و من ثم ضربتها في معكوس المصفوفه B واخيرا حسبت معكوس الناتج و كانت النتيجه قيم X :wacko:

ومنها كتبت برنامجي ولكن لايعمل :sad:

اتمني ان اجد المساعده في البرنامج ولكم مني كل الشكر والتقدير وجزاكم الله الف خير

وهذا هو البرنامج :=

 #include <cstdlib>
#include <cstdio>
#include<iostream>


using namespace std;

#define MAX 10

void transpose(float *A, int m, int n);
void inverse(float *AT, int ra, int ca);
void multiply(
              int* A, //first matrix 
              int ra, //first matrix rows 
              int* B, //second matrix 
              int cb, //second matrix columns 
              int sh, //SHARED DIMENSION as 'first' columns and 'second' rows MUST BE THE SAME 
              int* X //to store the result
              );

void get_mat(float *m, int &X, int &c); 
void disp(float* m, int X, int c);
void multiply(float* AI, int ra, float* B, int cb, int sh, float* X); 
float a[10][10];
float b[10][10];
float c[10][10];

int main()
{
    float *A, *AI, *AT, *B, *X;
    int ra, ca; // rows and columns for matrix ai
    int rb, cb; // rows and columns for matrix b
    int i, j;
    cout << "First matrix size(rows columns) = ";
    cin >> ra >> ca;

    cout << "Second matrix size(rows columns) = ";
    cin >> rb >> cb;

    //if (ca != rb){
    //  cout << "Error: The matrices cannot be multilplied, size mismatch.";
    //  return 0;  
    //}

    A = new float[ra * ca];
    AT = new float[ra * ca];
    AI = new float[ra * ca];
    B = new float[rb * cb]; 
    X = new float[ra * cb]; 


    get_mat(A, ra, ca);
    get_mat(B, rb, cb);
    cout << "Original matrix\n";
    disp(A, ra, ca);


    for (i = 0; i < ca; i++)
        for (j = 0; j < ra; j++)
        {
            a[j] = A[ca * i + j];
            cout << a[j] << "\n";

        }

    //TRANSPOSE         
    transpose(A, ra, ca);

    cout << "Transposed matrix\n";

    for (i = 0; i < ca; i++)
        for (j = 0; j < ra; j++)
        {
            AT[ca * i + j] = a[j];
            cout << AT[ca * i + j] << "\n";

        }
    //INVERSE
    inverse(AT, ra, ca);

    cout << "Inverse matrix\n";

    for (i = 0; i < ca; i++)
        for (j = 0; j < ra; j++)
        {
            AI[ca * i + j] = b[j];
            cout << AI[ca * i + j] << "\n";


        }
    //MULTIPLY

    multiply(AI, ra, B, cb, ca, X);    

    cout << "\n\nResult = \n";
    disp(X, ra, cb);
    cout << "\nResult Transpose = \n";
    disp(AT, ra, ca);
    cout << "\nResult Inverse = \n";
    disp(AI, ra, ca);

    cout << "Press any key to exit...";
     // getch();
    delete[] A;
    delete[] AT;
    delete[] AI;


    return 0;
}

void transpose(float *A, int m, int n)
{
    int i, j;

    for (i = 0; i < n; i++)
        for (j = 0; j < m; j++)
        {
            a[j] = A[n * i + j];
            cout << a[j] << "\n";
        }

    cout << endl << "Displaying Matrix Transpose: " << endl << endl;
    for (i = 0; i < m; i++)
    {
        for (j = 0; j < n; j++)
        {
            cout << a[j] << " ";
        }
        cout << endl << endl;
    }


	getch();
}

void inverse(float *AT, int ra, int ca)
{

    float d, m;
    int i, j, k;

    for (i = 0; i < ra; i++)
        for (j = 0; j < ca; j++)
        {
            a[j] = AT[ca * i + j];
            cout << a[j] << "\n";
        }


    for (i = 0; i < ca; i++)
    {
        for (j = 0; j < ra; j++)
        {
            if (i == j)
                b[j] = 1;
            else
                b[j] = 0;
        }
    }

    if (a[0][0] == 0)
    {
        for (j = 0; j < ca; j++)
        {
            c[0][j] = b[1][j];
            c[0][j] = a[1][j];
            a[1][j] = a[0][j];
            a[0][j] = c[0][j];
            b[1][j] = b[0][j];
            b[0][j] = c[0][j];
        }
    }

    for (i = 0; i < ca; i++)
    {
        d = a;

        for (j = 0; j < ra; j++)
        {
            a[j] = a[j] / d;
            b[j] = b[j] / d;
        }

        for (k = 0; k < ca; k++)
        {
            if (k != i)
            {
                m = a[k];
                for (j = 0; j < ra; j++)
                {
                    a[k][j] = a[k][j]-(a[j] * m);
                    b[k][j] = b[k][j]-(b[j] * m);
                }
            }
        }
    }

    cout << "\nInverse of matrix is:\n"; 
    for (i = 0; i < ca; i++)
    {
        for (j = 0; j < ra; j++)
            printf(" %f ", b[j]);

        printf("\n");

    }

	getch();
}

void get_mat(float *m, int &X, int &c)
{
    cout << "Enter [" << X << "x" << c << "] Matrix :\n";
    for (int i = 0; i < X * c; i++)
        cin >> m;
}

void multiply(float* AI, int ra, float* B, int cb, int sh, float* X)
{
    for (int i = 0; i < ra * cb; ++i)
    {
        X = 0;
        for (int j = 0; j < sh; ++j)
            X += AI[(i / cb) * sh + j] * B[i % cb + j * cb];
        if (X > 1)
        {
            X = 1;
        }
    }
}

void disp(float* m, int X, int c)
{
    for (int i = 0; i < X * c; i++)
    {
        !(i % c) && cout << endl;
        cout << m << '\t';
    }
    cout << endl;
}
//getchar();
//getchar();  
          = ';

وعليكم السلام أخي الكريم

لنفترض أن المصفوفة البولينية الأولى تكتب هكذا

A[2][3]=

{

{0,0,1},

{0,1,1}

};

و المصفوفة البولينية الثانية تكتب على هذا الشكل

B[3][3]=

{

{1,1,1},

{1,1,1},

{0,0,0}

};

و مصفوفة الخروج تريدها على هذا النحو

X[2][3]=

{

{1,1,1},

{1,1,1}

};

حسب فهمي للسؤال فإن

X[2][3] ==  A[2][3] * (B[3][3])^-1

وهل أبعاد المصفوفات محددة أ يَ A لها 2 صفوف و 3 أعمدة و B لها 3 صفوف و 3 أعمدة و الخارج X سيكون له صفين و 3 أعمدة

أم أن أبعاد المصفوفتين غير محددة و سيطلب من المستخدم في كل مرة إدخال أبعاد جديدة للمصفوفتين ؟

تم تعديل هذه المشاركة بواسطة مومو (momo) في 12 مايو 2012 في 13:15

i love you mama

#12

ليس لها ابعاد محدده و في كل مره سيطلب من المستخدم ادخال ابعاد جديده للمصفوفتين

ولكن المصفوفه الاولي لابد ان تكون منقول مصفوفه اما المصفوفه الثانيه فتكون معكوس مصفوفه

تم تعديل هذه المشاركة بواسطة justalayoubi في 12 مايو 2012 في 13:23

#13
justalayoubi كتب:

ليس لها ابعاد محدده و في كل مره سيطلب من المستخدم ادخال ابعاد جديده للمصفوفتين

ولكن المصفوفه الاولي لابد ان تكون منقول مصفوفه اما المصفوفه الثانيه فتكون معكوس مصفوفه

هل فهمي لسؤالك كان صائبا؟

منقول المصفوفة هي المصفوفة نفسها أم أنك تعني شيءا آخر؟

تم تعديل هذه المشاركة بواسطة مومو (momo) في 12 مايو 2012 في 13:31

i love you mama

#14

منقول المصفوفه ان تجعل صفوف المصفوفه اعمدتها والاعمده صفوف

#15
justalayoubi كتب:

منقول المصفوفه ان تجعل صفوف المصفوفه اعمدتها والاعمده صفوف

أوكي فهمنا قصدك بمنقول المصفوفة وماذا عن معكوس المصفوفة؟

مثلا نفترض أن المصفوفة على هذا الشكل

A[2][3]={1,0,0,1,0,0};

ستصبح على هذا الشكل

A[2][3]={0,0,1,0,0,1};

هل هذا ماتقصده بمعكوس المصفوفة ؟؟

تم تعديل هذه المشاركة بواسطة مومو (momo) في 12 مايو 2012 في 13:46

i love you mama

#16

معكوس المصفوفه البولينيه ان تجعل الأصفار آحاد والآحاد أصفار

1 = 0 اما 0 = 1

#17
justalayoubi كتب:

معكوس المصفوفه البولينيه ان تجعل الأصفار آحاد والآحاد أصفار

1 = 0 اما 0 = 1

أوكي مثلا

A[2][3]={1,0,0,1,0,0};

ستصبح هكذا

A[2][3]={0,1,1,0,1,1};

i love you mama

#18

بالضبط كده

#19
justalayoubi كتب:

بالضبط كده

لحل هذا السؤال ستحتاج فقط (les opérateurs bit-à-bit)

و بالتحديد فقط '&'

و ستحتاج فقط ل '!'

ولهذا '*' و هذا *+*

يعني السؤال ليس معقدا كما تصورت في الأول

السؤال بسيط يحتاج فقط لكود قصير و فهم قليل

تم تعديل هذه المشاركة بواسطة مومو (momo) في 12 مايو 2012 في 14:01

i love you mama

#20

و انا منتظر الحل يا مومو ( تسلم علي الشرح )

#21

أخى الكريم أنا على استعداد تام أن اساعد فى كتابة الكود بشرط أن تكتب المشكلة فى صورة خطوات(تسمى خوارزم) بشكل بسيط. أذكر لك مثال:

المطلوب أيجاد X

يمكن أيجادها بــ

1.أيجاد معكوس المصفوفة البولونية

-عن طريق تحويل الاصفار الى وحايد .

2.ضرب معكوس المصوفة فى المصفوفة a

عن طريق ......

وهكذا

بأختصار انت ستكتب التحليل الذى من خلالة المبرمج يكتب لك الكود ، لان المبرمج لن يبحث فى كيفية ايجاد معكوس المصفوفة ..... الخ.

اتمنى ان تكون فهمت وجهة نظرى أنا حقيقا نفسي اساعدك .

تم تعديل هذه المشاركة بواسطة AudaNix في 12 مايو 2012 في 14:37

post-15367-027053900%201340345097.gifpost-15367-087183200%201340344597.gif
post-247365-0-10080400-1379403554_thumb.

#22

شكرا جزيلا علي الرد و سأكتب لك الخطوات حالا :)

#23

لايجاد المصفوفه X :-

1. ندخل قيم المصفوفه A .

2. نوجد منقول المصفوفه A و ذلك بجعل اعمده المصفوفه صفوف , وصفوفها اعمده .

3. لتكن المصفوفه الناتجه A* .

4. ندخل قيم المصفوفه B .

5. نوجد معكوس المصفوفه B وذلك بعكس قيمها ( نجعل الاصفار آحاد 0=1 , و الآحاد أصفار 1=0 ) .

6. و لتكن المصفوفه الناتجه B* .

7. نوجد حاصل ضرب المصفوفتين A* ,* B و نسمي المصفوفه الناتجه X* .

8. نوجد معكوس المصفوفه X* ( كما في 5) . المصفوفه الناتجه هي X .

#24

يا ليتك فعلت من أول الامر ..... ممتاز

اقتباس
7. نوجد حاصل ضرب المصفوفتين A* ,* B و نسمي المصفوفه الناتجه X* .

لم توضح كيف تتم عملية الضرب

post-15367-027053900%201340345097.gifpost-15367-087183200%201340344597.gif
post-247365-0-10080400-1379403554_thumb.

#25

نوجد حاصل ضرب المصفوفتين A* , *B ( بضرب عناصر الصف الاول من المصفوفهA* بعناصر العمود الاول من المصفوفه B* ونجمع الناتج ليكون العنصر الاول لمصفوفه الضرب الناتجه وهكذا لايجاد بقيه العناصر )

واظن ان هذا الكود يفسر ذلك ( كود لضرب مصفوفتين ) :-

 void multiply()
{
    for (int i = 0; i < ra * cb; ++i)
    {
        X = 0;
        for (int j = 0; j < sh; ++j)
            X += AI[(i / cb) * sh + j] * B[i % cb + j * cb];
        if (X > 1)
        {
            X = 1;
        } = ';

* هذا الجزء من الكود مأخوذ من برنامجي في بدايه السؤال

مواضيع مشابهة