Tak začneme : program který vygeneruje soubor obsahujici matici nahodných cisel
Pozn. nezapomět nastavit v Java pri spoustění parametr -Xmx + hlavně při větších maticích je nutná větší RAM
(viz. např. Java pro jednu matici v paměti : 20 000 * 20 000 = 400 000 000 * 4byte(int) = 1matice(1,6GB RAM) +prostředí + Windows atd..)
import java.util.*;
import java.io.*;
public class B02_GeneratorMaticInt {
@SuppressWarnings("resource")
private static int nacteniVelikosti() {
Scanner key = new Scanner(System.in);
System.out.print("Vlozte Celociselne Cislo :");
int n = key.nextInt();
return n; }
@SuppressWarnings("resource")
private static String nacteniNazvu() {
Scanner key = new Scanner(System.in);
System.out.print("Vlozte Nazev souboru :");
String jmeno = key.nextLine();
return jmeno; }
private static int [][] vygenerovaniMatice(int velikost){
int [][] matice = new int [velikost][velikost];
for(int i=0;i<matice.length;i++) { // nacitani hodnot do matice z klavesnice
for(int j=0;j<matice[i].length;j++) {
matice[i][j] = (int) (Math.random() * 9); } } // matici naplnime hodnotami od 0 do 9
return matice; }
private static void ulozeniMatice(String s, int [][] matice) {
File NazevSoub = new File(s);
FileWriter ZapisovaciSoubor = null;
String radek = System.getProperty("line.separator"); // do promene radek ulozime systemem definovany radek
try {
ZapisovaciSoubor = new FileWriter(NazevSoub); }
catch (IOException e) {
System.out.println("Nepodarilo se vytvorit soubor ");
e.printStackTrace(); }
try {
ZapisovaciSoubor.write(matice.length+radek);
for(int i=0;i<matice.length;i++) { // nacitani hodnot do matice z klavesnice
for(int j=0;j<matice[i].length;j++) {
ZapisovaciSoubor.write(matice[i][j]+" "); }
ZapisovaciSoubor.write(radek); } }
catch (Exception e) {System.out.println("Nepodarilo se provest zapis matice"); }
try {
ZapisovaciSoubor.close(); }
catch (IOException e) {
System.out.println("Nepodarilo se ukoncit napojeni na soubor ");
e.printStackTrace(); } } // uzavreme soubor
@SuppressWarnings("unused")
private static void tiskMatice(int [][] matice) {
System.out.println("Zde je vypsana matice");
for (int i = 0; i < matice.length; i++) {
for (int j = 0; j < matice[i].length; j++) {
System.out.format("%d ", matice[i][j]); }
System.out.println(); } }
public static void main(String [] args) {
String jmenoSouboru;
int velikost;
System.out.println("Program pro vygenerovani matic a jejich ulozeni do souboru");
System.out.println("Vlozte velikost matice - cele cislo (bez desetinne carky)");
while(true) { // nekonecna smycka
try{
velikost=nacteniVelikosti(); break; }
catch(RuntimeException E){ System.err.print("Vstup neni celociselne cislo"); } }
System.out.println("Vlozte prosim jmeno souboru do ktereho chcete provest ulozeni vygenerovane matice");
while(true) { // nekonecna smycka
try {
jmenoSouboru = nacteniNazvu(); break; }
catch(RuntimeException E) { System.err.print("Nejedna se o retezec");} }
int [][] Matice;
Matice = vygenerovaniMatice(velikost);
//tiskMatice(Matice); // pro kontrolu
ulozeniMatice(jmenoSouboru,Matice);
}
}
Zde je zdrojak v Cčku, který je schopen načíst námi vygenerovaný soubor
#include<stdio.h>
#include<time.h>
main(){
clock_t startCteni1,konecCteni1,startCteni2,konecCteni2,startNasob,konecNasob,startZapis,konecZapis;
printf("Program na vypocet nasobeni matic\n");
char nazevSouboru1 [15];
printf("Vlozte jmeno souboru pro matici 1 :");
scanf("%15s",nazevSouboru1); // pozor cteme pouze prvnich 15 znaku --- %15s
char nazevSouboru2 [15];
printf("Vlozte jmeno souboru pro matici 2 :");
scanf("%15s",nazevSouboru2); // pozor cteme pouze prvnich 15 znaku --- %15s
FILE *fr1,*fr2;
fr1 = fopen(nazevSouboru1,"r"); // nacteme soubor 1
int velikost1,velikost2;
fscanf(fr1,"%i",&velikost1);
printf("Zde je prvni cislo : %i\n",velikost1);
/** DEKLARUJEME A INICIALIZUJEM(ALOKUJEME) MATICI A pointeru na pointer **/
int i,j,k;
int **maticeA;
maticeA=(int**)malloc(velikost1*sizeof(int*));
for(i=0;i<velikost1;i++) {
maticeA[i]=(int*)malloc(velikost1*sizeof(int)); }
/************* Nacitame matici A *******************/
printf("Nacitame matici 1\n");
startCteni1=clock();
for(i=0;i<velikost1;i++) {
for(j=0;j<velikost1;j++){
fscanf(fr1,"%i",&maticeA[i][j]); } }
konecCteni1=clock();
printf("Nacitani prvni matice trvalo %6.2f sec\n",(konecCteni1-startCteni1)/(double) CLOCKS_PER_SEC);
/*printf("Zde je nactena matice A\n");
for(i=0;i<velikost1;i++) {
for(j=0;j<velikost1;j++) {
printf("%i ",maticeA[i][j]); }
printf("\n"); }*/
fclose(fr1);
/** DEKLARUJEME A INICIALIZUJEM(ALOKUJEME) MATICI B pointeru na pointer **/
fr2 = fopen(nazevSouboru2,"r"); // nacteme soubor 1
fscanf(fr2,"%i",&velikost2);
int **maticeB;
maticeB=(int**)malloc(velikost2*sizeof(int*));
for(i=0;i<velikost2;i++) {
maticeB[i]=(int*)malloc(velikost1*sizeof(int)); }
/************* Nacitame matici B *******************/
printf("Nacitame matici 2\n");
startCteni2=clock();
for(i=0;i<velikost2;i++) {
for(j=0;j<velikost2;j++){
fscanf(fr2,"%i",&maticeB[i][j]); } }
konecCteni2=clock();
printf("Nacitani druhe matice trvalo %6.2f sec\n",(konecCteni2-startCteni2)/(double) CLOCKS_PER_SEC);
/*printf("Zde je nactena matice B\n");
for(i=0;i<velikost2;i++) {
for(j=0;j<velikost2;j++) {
printf("%i ",maticeB[i][j]); }
printf("\n"); }*/
fclose(fr2);
/** DEKLARUJEME A INICIALIZUJEM(ALOKUJEME) MATICI C pointeru na pointer **/
printf("Provadime nasobeni matic \n");
int **maticeC;
maticeC=(int**)malloc(velikost1*sizeof(int*));
for(i=0;i<velikost2;i++) {
maticeC[i]=(int*)malloc(velikost2*sizeof(int)); }
/************* Nasobime matici A x B = vznik matice C *******************/
startNasob=clock();
for(i=0;i<velikost1;i++) { // cyklus pro nasobeni matic
for(j=0;j<velikost2;j++) {
maticeC[i][j] = 0;
for(k=0;k<velikost1;k++) {
maticeC[i][j]=maticeC[i][j] + maticeA[i][k] * maticeB[k][j]; } } }
konecNasob = clock();
printf("Doba nasobeni matice %6.2f sec\n",(konecNasob-startNasob)/(double) CLOCKS_PER_SEC);
/*printf("Zde je vypoctena matice\n");
for(i=0;i<velikost1;i++) {
for(j=0;j<velikost2;j++) {
printf("%i ",maticeC[i][j]); }
printf("\n"); }*/
/****************** Ulozime matici do Souboru ***************************/
free(maticeA);maticeA=NULL; // vymazeme hodnoty a referenci
free(maticeB);maticeB=NULL; // vymazeme hodnoty a referenci
char nazevSouboru3 [15];
printf("Vlozte jmeno souboru pro matici 3 (vyslednou):");
scanf("%15s",nazevSouboru3); // pozor cteme pouze prvnich 15 znaku --- %15s
FILE *fr3;
fr3 = fopen(nazevSouboru3,"w"); // nacteme soubor 1
fprintf(fr3,"%i\n",velikost1); // ulozime rad matice
startZapis =clock();
for(i=0;i<velikost2;i++) {
for(j=0;j<velikost2;j++) {
fprintf(fr3,"%i ",maticeC[i][j]); }
fprintf(fr3,"\n"); }
konecZapis = clock();
printf("Doba ukladani matice %6.2f sec\n",(konecZapis-startZapis)/(double) CLOCKS_PER_SEC);
fclose(fr3);
free(maticeC);maticeC=NULL; // vymazeme hodnoty a referenci
printf("Program ukoncite stiknutim libovolne klavesy");
getch(); // cekame na stiknuti klavesnice
}
A zde je ten naprosto identický kód v Javě
import java.io.*;
import java.util.*;
public class B05_NasobeniMaticInt {
@SuppressWarnings("resource")
private String nacteniNazvu() {
Scanner key = new Scanner(System.in);
System.out.print("Vlozte Nazev souboru :");
String jmeno = key.nextLine();
return jmeno; }
private int [][] nacteniMatice(String s) {
File NazevSoub = new File(s);
FileReader CteciSoubor=null;
BufferedReader Soubor=null;
int velikost;
try { //Zkousime otevrit pripojeni k souboru
CteciSoubor = new FileReader(NazevSoub);
Soubor = new BufferedReader(CteciSoubor); }
catch (IOException e) {
System.out.println("Nepodarilo se otevri soubor pro cteni");
e.printStackTrace(); }
int [][] matice = null;
try { // Zkusime nacist hodnoty
String retezec = Soubor.readLine(); // nacteme prvni radek kde je pouze velikost matice
velikost = Integer.valueOf(retezec).intValue(); // prevedem velikost na integer
matice = new int [velikost][velikost];
for(int i=0;i<matice.length;i++) { // nacitani hodnot do matice z klavesnice
retezec = Soubor.readLine(); // nacteme do stringu cely radek
String [] podretezce = retezec.split(" "); // vytvorime pole hodnot
for(int j=0;j<matice[i].length;j++) {
matice[i][j] = Integer.valueOf(podretezce[j]).intValue(); } } } // Prevedeme jednotlive prvky pole stringu na integer do jednotlivych casti poli
catch (Exception e) {System.out.println("Nepodarilo se provest zapis matice"); }
try { // Zkusime uzavrit pripojeni k souboru
CteciSoubor.close();
Soubor.close(); }
catch (IOException e) {
System.out.println("Nepodarilo se ukoncit napojeni na soubor ");
e.printStackTrace(); } // uzavreme soubor
return matice; }
@SuppressWarnings("unused")
private void tiskMatice(int [][] matice) {
System.out.println("Zde je vypsana matice");
for (int i = 0; i < matice.length; i++) {
for (int j = 0; j < matice[i].length; j++) {
System.out.format("%d ", matice[i][j]); }
System.out.println(); } }
private int [][] nasobeniMatic(int [][] maticeA,int [][] maticeB) {
int [][] maticeNasob=new int [maticeA.length][maticeB[0].length]; // u vysledne matice rozhoduji sloupce a pak radky
for(int i=0;i<maticeNasob.length;i++) { // cyklus pro nasobeni matic
for(int j=0;j<maticeNasob[i].length;j++) {
maticeNasob[i][j] = 0;
for(int k=0;k<maticeNasob.length;k++) {
maticeNasob[i][j]=maticeNasob[i][j] + maticeA[i][k] * maticeB[k][j]; } } }
return maticeNasob; }
private void ulozeniMatice(String s, int [][] matice) {
File NazevSoub = new File(s);
FileWriter ZapisovaciSoubor = null;
String radek = System.getProperty("line.separator"); // do promene radek ulozime systemem definovany radek
try {
ZapisovaciSoubor = new FileWriter(NazevSoub); }
catch (IOException e) {
System.out.println("Nepodarilo se vytvorit soubor ");
e.printStackTrace(); }
try {
ZapisovaciSoubor.write(matice.length+radek);
for(int i=0;i<matice.length;i++) { // nacitani hodnot do matice z klavesnice
for(int j=0;j<matice[i].length;j++) {
ZapisovaciSoubor.write(matice[i][j]+" "); }
ZapisovaciSoubor.write(radek); } }
catch (Exception e) {System.out.println("Nepodarilo se provest zapis matice"); }
try {
ZapisovaciSoubor.close(); }
catch (IOException e) {
System.out.println("Nepodarilo se ukoncit napojeni na soubor ");
e.printStackTrace(); } } // uzavreme soubor
@SuppressWarnings("unused")
public static void main(String [] args) {
B05_NasobeniMaticInt objekt = new B05_NasobeniMaticInt();
System.out.println("Program pro nasobeni matic integeru pro nacitani ze souboru");
String jmenoSouboru1,jmenoSouboru2,jmenoSouboru3;
String radek = System.getProperty("line.separator"); // do promene radek ulozime systemem definovany radek
System.out.println("Vlozte prosim jmeno souboru ze ktereho chcete nacit matici cislo 1");
while(true) { // nekonecna smycka
try {
jmenoSouboru1 = objekt.nacteniNazvu(); break; }
catch(RuntimeException E) { System.err.print("Nejedna se o retezec");} }
System.out.println("Vlozte prosim jmeno souboru ze ktereho chcete nacit matici cislo 2");
while(true) { // nekonecna smycka
try {
jmenoSouboru2 = objekt.nacteniNazvu(); break; }
catch(RuntimeException E) { System.err.print("Nejedna se o retezec");} }
System.out.println("Provedem nacteni matice do pole :");
int [][] MaticeA,MaticeB,MaticeZnasobena;
long nacteni1 = System.currentTimeMillis();
MaticeA = objekt.nacteniMatice(jmenoSouboru1);
//tiskMatice(MaticeA); // pro kontrolu
long nacteni2 = System.currentTimeMillis();
MaticeB = objekt.nacteniMatice(jmenoSouboru2);
long nactenikonec = System.currentTimeMillis();
System.out.println("Nacitani matice prvni :\t"+(nactenikonec-nacteni2)+" milisekund\nNacteni matice druhe :\t"+(nacteni2-nacteni1)+" milisekund");
long zacatekNasobeni = System.currentTimeMillis();
MaticeZnasobena = objekt.nasobeniMatic(MaticeA,MaticeB);
long konecNasobeni = System.currentTimeMillis();
System.out.println("Nasobeni matic trvalo :\t"+(konecNasobeni-zacatekNasobeni)+" milisekund\nVelikost Matice :"+MaticeZnasobena.length);
//tiskMatice(MaticeZnasobena); // pro kontrolu
System.out.println("Vlozte prosim jmeno souboru do ktereho chcete ulozit vyslednou matici");
while(true) { // nekonecna smycka
try {
jmenoSouboru3 = objekt.nacteniNazvu(); break; }
catch(RuntimeException E) { System.err.print("Nejedna se o retezec");} }
long ulozeni1 = System.currentTimeMillis();
objekt.ulozeniMatice(jmenoSouboru3,MaticeZnasobena);
long ulozeni2 = System.currentTimeMillis();
System.out.println("Ulozeni matice trvalo :\t"+(ulozeni2-ulozeni1)); }
}
Upozorňuji že neřeším načítaní ze souboru, ukládání do souboru ale část kódu kde probíhá násobení matic. Dále upozorňuji neberte vážně mé komentáře hlavně Cčku - terminologii daného jazyka neovládám. V té Javě beru i fígle typu nastavení Oracle JVM atd.. Fakt se rád poučím od lidí, kteří se tomu věnují mnohem,mnohem déle. Většinou je to tu plné blbých hospodských keců (typu :Kaufland je nejlevnější, pivo je zdravé atd..) všechno velmi obecné bez konkrétních důkazů. Zatím je závěr pro mě takový že na matematické výpočty je stále Java zásadně pomalejší. Doměnka :(nechce se mi kupovat stroj s 128,..,512 GBRAM abych si to ověřil) U větších matic velikosti 50 000, 100 000, 200 000 to budou skoro řádové rozdíly v času.