Poslao: 20 Sep 2020 19:17
|
offline
- mpman
- Mod u pemziji
- Pridružio: 12 Okt 2010
- Poruke: 10910
|
Imam excel fajl sa preko 12000 unosa i potrebno je filtrirati podatke, tj. izdvojiti grupe podataka radi lakše kasnije analize.
To sam probao na sledeći način.
U matricu A učitava se Excel fajl, tj. njegov sadržaj. Definišem matricu B1 kao matricu u koju ću da sačuvam delove Excel fajla koji ispunjavaju određeni kriterijum. Pitam koje su dimenzije matrice A i tu informaciju čuvam u vidu vektora u promenljivoj C. Malo c je brojač za petlju.
Definišem prvu petlju koja bi trebala da prođe kroz matricu A od 1. unosa do poslednjeg. Postavljam uslovda je član treće kolone u svakom redu jednak jedinici. Ukoliko je to slučaj, ceo red se upisuje u matricu B1 gde je c broj reda, a j broj kolone.
Zatim ponavljam isti postupak za matricu B2 , gde je kriterijum da je u trećem redu broj 2.
pkg load io
A=xlsread('Book1 (Autosaved).xlsx','Sheet1','A4:L12738');
B1=eye(2,2);
B2=eye(2,2);
B3=eye(2,2);
B4=eye(2,2);
B5=eye(2,2);
C=size(A);
c=1;
for i=1:C(1)
if A(i,3)==1
for j=1:C(2)
B1(c,j)=A(i,j);
endfor
c=c+1;
endif
endfor
xlswrite('Filtrirano',B1,'Slucaj 1 + masa','A3:L12738');
c=1;
for i=1:C(1)
if A(i,3)==2
for j=1:C(2)
B2(c,j)=A(i,j);
endfor
endif
c=c+1;
endfor
Međutim, ono što dobijam je sledeće. Prvo filtriranje odradi kako treba, ali ostala ne, iako je kod gotovo identičan i radi se sa istim fajlom, dobijam mnogo 0 matrica unutar B2, B3 itd...
Gde grešim?
|
|
|
Registruj se da bi učestvovao u diskusiji. Registrovanim korisnicima se NE prikazuju reklame unutar poruka.
|
|
Poslao: 21 Sep 2020 19:45
|
offline
- mpman
- Mod u pemziji
- Pridružio: 12 Okt 2010
- Poruke: 10910
|
Reših:
podaci=xlsread('Analiza_2_21-09-2020.xlsx','Sheet1');
dimenzije_podaci=size(podaci);
podaci_dim=size(podaci)
i_podaci=podaci_dim(1);
j_podaci=podaci_dim(2);
isl1=1;
isl2=1;
isl3=1;
isl4=1;
isl5=1;
slucaj_1=[0,0;0,0];
slucaj_2=[0,0;0,0];
slucaj_3=[0,0;0,0];
slucaj_4=[0,0;0,0];
slucaj_5=[0,0;0,0];
for i=1:i_podaci
if podaci(i,3)==1
for j=1:j_podaci
slucaj_1(isl1,j)=podaci(i,j);
endfor
isl1=isl1+1;
elseif podaci(i,3)==2
for j=1:j_podaci
slucaj_2(isl2,j)=podaci(i,j);
endfor
isl2=isl2+1;
elseif podaci(i,3)==3
for j=1:j_podaci
slucaj_3(isl3,j)=podaci(i,j);
endfor
isl3=isl3+1;
elseif podaci(i,3)==4
for j=1:j_podaci
slucaj_4(isl4,j)=podaci(i,j);
endfor
isl4=isl4+1;
elseif podaci(i,3)==5
for j=1:j_podaci
slucaj_5(isl5,j)=podaci(i,j);
endfor
isl5=isl5+1;
endif
endfor
Možda nije najefikasniji algoritam za filtriranje, ali - radi.
Na 15 000 unosa Octave je nestabilan i hoće da se sruši pre nego što završi filtriranje.
|
|
|
|
Poslao: 21 Sep 2020 20:54
|
offline
- ivance95
- AMF pripravnik
- Pridružio: 04 Jul 2011
- Poruke: 5424
|
To je zbog toga što ga ne koristiš na ispravan način, ove for petlje koje koristiš za pretragu matrice su zlo u Matlabu/Octave... Znam da si tako navikao iz C, Pascal itd. Ali u Matlab/Octave se to ne radi tako, oba alata su optimizovana za rad sa matricama i nizovima, ali samo ako koristiš onako kako je zamišljeno.
Nisam se udubljivao u tvoj kod, ali šta hoću da kažem je da ako recimo imaš matricu A koja ima neke proizvoljne vrednosti, i hoćeš da sve vrednosti veće od 1 prepišeš sa 1, tj. da ako recimo imaš u nekom polju vrednost dva, to će postati jedan itd. To bi mogao da odradiš duplom for petljom i if upitom, ali u matlabu se to radi kao.
A(A>1) = 1
Ta komanda prolazi kroz celu matricu, i prepisuje sve vrednosti veće od 1, a radi neuporedivo brže nego for petlje, to možeš i da probaš na nekom primeru... To sve naravno ima smisla za velike matrice, kakva je i tvoja, kad imaš 30 elemenata nije ni bitno...
|
|
|
|
Poslao: 24 Sep 2020 12:07
|
offline
- mpman
- Mod u pemziji
- Pridružio: 12 Okt 2010
- Poruke: 10910
|
Napisano: 22 Sep 2020 7:11
ivance95 ::To je zbog toga što ga ne koristiš na ispravan način, ove for petlje koje koristiš za pretragu matrice su zlo u Matlabu/Octave... Znam da si tako navikao iz C, Pascal itd. Ali u Matlab/Octave se to ne radi tako, oba alata su optimizovana za rad sa matricama i nizovima, ali samo ako koristiš onako kako je zamišljeno.
Nisam se udubljivao u tvoj kod, ali šta hoću da kažem je da ako recimo imaš matricu A koja ima neke proizvoljne vrednosti, i hoćeš da sve vrednosti veće od 1 prepišeš sa 1, tj. da ako recimo imaš u nekom polju vrednost dva, to će postati jedan itd. To bi mogao da odradiš duplom for petljom i if upitom, ali u matlabu se to radi kao.
A(A>1) = 1
Ta komanda prolazi kroz celu matricu, i prepisuje sve vrednosti veće od 1, a radi neuporedivo brže nego for petlje, to možeš i da probaš na nekom primeru... To sve naravno ima smisla za velike matrice, kakva je i tvoja, kad imaš 30 elemenata nije ni bitno...
Nije mi baš to bilo potrebno. Radim strukturnu analizu rešetkaste konstrukcije od preko 500 elemenata. Softver izbacuje Excel tabelu sa rezultatima sa 12000+ unosa, međutim to treba soritrati po grupama elemenata (po poprečnom preseku), a da bu to moglo da se odradi, mora da se identifikuje koji element ima koji poprečni presek. Listu poprečnih preseka u excel tabeli sam takođe izvukao iz programa, a meni treba jedinstvena lista sa slučajevima opterećenja (sortirati samo na osnovu jedne kolone). Znači, prvo treba dodati 13. kolonu sa identifikacijom poprečnog preseka, a onda sortirati u posebne exel sheet-ove na osnovu - ili poprečnog preseka (kolone 13) ili slučaja opterećenja (kolona 3).
A(A>1)=1 posmatra celu matricu, ali je meni matrica oblika:
gde svaka kolona ima potpuno drugo značenje.
Predlog profesora je bio da ovo radim ručno
Dopuna: 24 Sep 2020 12:07
Ubacio sam disp() komandu da bih video gde ide najviše vremena pri pokretanju skripte.
Filtriranje zapravo traje najkraće.
Čitanje Excel fajla i upis u Excel fajl traju i po 10 minuta.
|
|
|
|