• 0
djwy

برنامج بسيط لضرب مصفوفتين لكن النتيجة تظهر لي خاطئة ؟؟؟

سؤال

السلام عليكم ورحمة الله تعالى وبركاته 

أنا أحاول كتابة برنامج لحساب ضرب  مصفوفتين  n*n مصفوفات C = A * B 
اقوم بالحساب بواسطة Threads  ثلاثة ، وأنا استخدم two class 
ولكن هناك خطأ في نتيجة (غير صحيحة) هذا هو  شفرة المصدر.: 
 
import java.util.Scanner;
import java.util.concurrent.Semaphore;
public class Matrice
{
private static int size,i,j,k;
private    static int matrice1[][]; // Premiere matrice
private   static int matrice2[][];// Deuxieme matrice
private   static int resultat[][];// Matrice resultat
private   static int vecteur[]; /* vecteur pour Numérotation des lignes et voir la ligne que cela fonctionne et que cela n'a pas fonctionné après*/
     
    public static void main(String[] args) throws InterruptedException
    {
    Semaphore semaphore = new Semaphore(1);//sémaphore pour controler l'acces au vecteur 
        java.util.Random r=new java.util.Random( ) ; 
//int t1=(Integer.toString(r.nextInt(25))); nbr aleatoire de 1 a 25 
       
        Scanner read =new Scanner(System.in);
System.out.print("Enter the size of the matrice : ");
              size =read.nextInt();
 
        // Generation des matrices
        matrice1 = new int;
        matrice2 = new int;
        resultat = new int;
        vecteur = new int;
         
        System.out.print("enter the elements of the first matrix: ");
        System.out.print("\n");
        for(i=0;i<size;i++) {
        for(j=0;j<size;j++) {
             
                   k=r.nextInt(25)+1; 
        matrice1[j]=k;
                      System.out.print(" "+matrice1[j]);
            if(j==size-1) System.out.print("\n");  
          }
        }
       
        for(i=0;i<size;i++){ //intialiser tous le matrice de resultat avec zéro 
        for(j=0;j<size;j++){       
        resultat[j]=0;}}
       
        System.out.print("enter the elements of the second matrix: ");
        System.out.print("\n");
        for(i=0;i<size;i++) {
        for(j=0;j<size;j++) {
              // k=read.nextInt();
                    k=r.nextInt(25)+1;
        matrice2[j]=k;
                        System.out.print(" "+matrice2[j]);
            if(j==size-1) System.out.print("\n");
          }
        }
        for(j=0;j<size;j++){ vecteur[j]=0;} 
     
       
        // Creation du groupe de thread
       
       ThreadGroup threads_Group = new ThreadGroup("Multi_threads");
       
         
        // Un thread pour chaque ligne
       
       
        new Thread(threads_Group, new Threads("thread1",matrice1, matrice2, vecteur,resultat,size,semaphore)).start();
        new Thread(threads_Group, new Threads("thread2",matrice1, matrice2, vecteur,resultat,size,semaphore)).start();
        new Thread(threads_Group, new Threads("thread3",matrice1, matrice2, vecteur,resultat,size,semaphore)).start();
 
         
             
        
        /************************/
        
        
        Thread.sleep(2000);
       System.out.print("\n");
        for ( int i = 0;i < size; i++)
        {
           
            for (int j = 0; j < size; j++)
            {
            
            System.out.print(" "+resultat[j]);
            if(j==size-1) System.out.print("\n");
           
            }
        }
      
}
    }

the second class

import java.util.concurrent.Semaphore;public class Threads implements Runnable{	private int tmp[][] ;// Matrice resultat    private int m1[][] ;    private int m2[][];    private int m3[]; //vecteur    private int k=0,r;// Numero de la ligne de m1 a multiplier avec les colonnes de m2   int p=0;   private Semaphore first;   private String str;     Threads(String str,int m1[][], int m2[][], int m3[], int tmp[][],int r,Semaphore s1)    {        this.m1 = m1;        this.m2 = m2;        this.m3 = m3;        this.tmp = tmp;        this.r = r;         first = s1;        this.str = str;       }        public void run()    {    		    	try	{     		while(m3[r-1]==0){     	    			  first.acquire();    			while(m3[p]==1){ p++; }		  			 	      if(m3[p]==0){    	  k=p;    	  m3[p]=1;    	 // bool=0;    	  System.out.println(p+" "+str );    	  }    	        first.release();     Thread.sleep(30);                     for ( int i = 0;i < r; i++)        {	// Somme des produits, nous donne *un* element de tmp            for (int j = 0; j < r; j++)            {               tmp[k][i] += m1[k][j] * m2[j][i];               System.out.print(" "+tmp[k][i]);            }        }       }    		    		    		  System.out.print("***************************");	      	}  catch (InterruptedException e) {            Thread.currentThread().interrupt();            e.printStackTrace();}    }}

الرجاء المساعدة وشكرا لكم جميعـــــــا

 

Matrice.java

Threads.java

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

3 إجابة على هذا السؤال .

  • 0

لم أجرب الكود، لكنك تستخدم thread، هل متأكد من ترتيب ضرب المصفوفة متسلسل؟ الـthread قد تعمل عشوائياً وضرب المصفوفات غير إبدالي، M1×M2 قد لايساوي M2×M1.

تم تعديل بواسطه Mr.B
1

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

نعم أخي أنا أستخدم الThreads ثلاثة منهم. أنا هنا كما ترى أقوم بضرب  M1*M2  وأستخدم semaphore first وذلك لتنظيم الدخول للvecteur الذي يسمح بتحديد السطر الذي سيتم حسابه في المصفوفة وكذلك الأسطر التي تم حسابها ..بحيث إذا كان 0==[m3[p فهذا يعني أن السطر p لم يتم حسابه بعد ويعطي لthread الداخل رقم السطر k=p لكي يقوم بحسابه ونغير 1==[m3[p ليعلم threads الآخرون أن هذا السطر تم حسابه وينتقل ل p++..

أنا أظن أن المشكل في هذه المنطقة :

 

 



    Threads(String str,int m1[][], int m2[][], int m3[], int tmp[][],int r,Semaphore s1)    {        this.m1 = m1;        this.m2 = m2;        this.m3 = m3;        this.tmp = tmp;        this.r = r;         first = s1;        this.str = str;       }        public void run()    {    		    	try	{     		while(m3[r-1]==0){     	    			  first.acquire();    			while(m3[p]==1){ p++; }		  			 	      if(m3[p]==0){    	  k=p;    	  m3[p]=1;    	 // bool=0;    	  System.out.println(p+" "+str );    	  }    	        first.release();     Thread.sleep(30);                     for ( int i = 0;i < r; i++)        {	// Somme des produits, nous donne *un* element de tmp            for (int j = 0; j < r; j++)            {               tmp[k][i] += m1[k][j] * m2[j][i];               System.out.print(" "+tmp[k][i]);            }        }       }    		    		    		  System.out.print("***************************");	      	}  catch (InterruptedException e) {            Thread.currentThread().interrupt();            e.printStackTrace();}    }}

 

 

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

نعم أخي أنا أستخدم الThreads ثلاثة منهم. أنا هنا كما ترى أقوم بضرب  M1*M2  وأستخدم semaphore first وذلك لتنظيم الدخول للvecteur الذي يسمح بتحديد السطر الذي سيتم حسابه في المصفوفة وكذلك الأسطر التي تم حسابها ..بحيث إذا كان 0==[m3[p فهذا يعني أن السطر p لم يتم حسابه بعد ويعطي لthread الداخل رقم السطر k=p لكي يقوم بحسابه ونغير 1==[m3[p ليعلم threads الآخرون أن هذا السطر تم حسابه وينتقل ل p++..

أنا أظن أن المشكل في هذه المنطقة :

 

 



    Threads(String str,int m1[][], int m2[][], int m3[], int tmp[][],int r,Semaphore s1)    {        this.m1 = m1;        this.m2 = m2;        this.m3 = m3;        this.tmp = tmp;        this.r = r;         first = s1;        this.str = str;       }        public void run()    {    		    	try	{     		while(m3[r-1]==0){     	    			  first.acquire();    			while(m3[p]==1){ p++; }		  			 	      if(m3[p]==0){    	  k=p;    	  m3[p]=1;    	 // bool=0;    	  System.out.println(p+" "+str );    	  }    	        first.release();     Thread.sleep(30);                     for ( int i = 0;i < r; i++)        {	// Somme des produits, nous donne *un* element de tmp            for (int j = 0; j < r; j++)            {               tmp[k][i] += m1[k][j] * m2[j][i];               System.out.print(" "+tmp[k][i]);            }        }       }    		    		    		  System.out.print("***************************");	      	}  catch (InterruptedException e) {            Thread.currentThread().interrupt();            e.printStackTrace();}    }}

 

 

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

من فضلك سجل دخول لتتمكن من التعليق

ستتمكن من اضافه تعليقات بعد التسجيل



سجل دخولك الان

  • يستعرض القسم حالياً   0 members

    لا يوجد أعضاء مسجلين يشاهدون هذه الصفحة .