Octave/Matlab filtriranje

Octave/Matlab filtriranje

offline
  • Pridružio: 12 Okt 2010
  • Poruke: 10904

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.
offline
  • Pridružio: 12 Okt 2010
  • Poruke: 10904

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.



offline
  • 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...

offline
  • Pridružio: 12 Okt 2010
  • Poruke: 10904

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 Mr. Green

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.

Ko je trenutno na forumu
 

Ukupno su 602 korisnika na forumu :: 22 registrovanih, 1 sakriven i 579 gosta   ::   [ Administrator ] [ Supermoderator ] [ Moderator ] :: Detaljnije

Najviše korisnika na forumu ikad bilo je 3466 - dana 01 Jun 2021 17:07

Korisnici koji su trenutno na forumu:
Korisnici trenutno na forumu: 9k38, babaroga, Bane san, Bokiboks, ccoogg123, cifra, CikaKURE, Dimitrise93, Georgius, ladro, loon123, mikrimaus, mnn2, Parker, procesor, repac, Roman Dudoladoff, suton, vandrej, Vatreni Zmaj, W123, yufighter