java.lang.ArrayIndexOutOfBoundsException

0

Problem taki mam zamienic to

for i:=1 to N do
		  begin 
		    for  j:=i+1 to N+i do      
		            mji := - fji / fii;
		    for  j=i+1 to N+i do
		       for  k=i+1 to N+K  do
		           fjk = fjk + mji ⋅  fik ;
		  end;
		gdzie fij = aij  ,              i=1,2,...,N,        j=1,2,...,N;
		        fij = bij  ,              i=1,2,...,N,        j=N+1,N+2,...,N+K;
		       f(N+i)i = -1 ,          i=1,2,...,N; 
		       f(N+i)j =  0 ,          i=1,2,...,N,        j=i+1,i+2,...,N+K;
		Wyniki: xij = f(N+i)(N+j) ,  i=1,2,...N,      j=1,2,...,K.

Na jave noi zrobilem ale wyrzuca mi blad co w temacie ??

public void oblicz(){   	
    	for(int i=1; i<macierzm.length; i++){
    		for (int j=i+1; j<macierzm.length+i; j++){
    			macierzm[j][i] = -macierzf[j][i] / macierzf[i][i];    			
    		}
    		for(int j=i+1; j<macierzm.length+i; j++){
    			for(int k=i+1; k<macierzm.length+macierzm[i].length; k++ ){
    				macierzf[j][k]=macierzf[j][k]+macierzm[j][i]*macierzf[i][k];
    			}
    		}
    	}

Bład dotyczy tego ze wychodze poza zakres tablicy ..
Np tu
for (int j=i+1; j<macierzm.length+i; j++)
no ale w koncu nie moge zrobic inaczej tak jest w tamtym kodzie to niby jak to mam zamienic ??

Myśle tez nad taka opcja że po wykonaniu tych obliczen macierz robi sie wieksza i moze powinienem
ja przechowywac w jakiej macierzy posredniej ?? moze w tym jest bład??

1

W javie tablice są indeksowane od 0.
for(int i=0;i<N-1;i++)
resztę zmień analogicznie.

0

Zamieniłem tak :

public void oblicz(){   	
    	for(int i=0; i<macierzm.length; i++){
    		for (int j=i; j<macierzm.length+i; j++){
    			macierzm[j][i] = -macierzf[j][i] / macierzf[i][i];    			
    		}
    		for(int j=i; j<macierzm.length+i; j++){
    			for(int k=i; k<macierzm.length+macierzm[i].length; k++ ){
    				macierzf[j][k]=macierzf[j][k]+macierzm[j][i]*macierzf[i][k];
    			}
    		}

I teraz mi wywala bład w 2 petli a nie 1....
W macierzm.lenght nie odejmowalwm 1 bo chyba ona sama iteruje sie od zera (zreszta probowalem zmienic to i tak zle bylo)

0
for (int j=i; j<macierzm.length+i; j++)

To będzie się iterować do max. j = (macierzm.length - 1) * 2 , z czego już przy i = 1, j = macierzm.length wyleci poza zakres.

0

No tak .... żeczywiscie. To jak mam podmienic te petle z pascala. W zyciu z pascalem sie nie bawilem a tam wyraznie jest N+1
czyli zrozumialem to tak macierzm.lenght+i od poczatku mi to nie pasowalo. Ale se myslalem skoro w tamtym kodzie dziala ....

Czyli zrobic tak i bedzie poprawnie??

public void oblicz(){           
            for(int i=0; i<macierzm.length; i++){
                    for (int j=i; j<macierzm.length; j++){
                            macierzm[j][i] = -macierzf[j][i] / macierzf[i][i];                            
                    }
                    for(int j=i; j<macierzm.length; j++){
                            for(int k=i; k<macierzm.length; k++ ){
                                    macierzf[j][k]=macierzf[j][k]+macierzm[j][i]*macierzf[i][k];
                            }
                    }
            }
0

Nie jestem pewien, czy w pierwszym poście na pewno dobrze to opisałeś, ale z tego wynika, że pętle powinieneś iterować do jakiegoś N (macierzf.length), a macierzm powinna być odpowiednio większa.

1 użytkowników online, w tym zalogowanych: 0, gości: 1