Octave/Matlab filtriranje

Octave/Matlab filtriranje

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

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: 10796

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: 10796

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 1223 korisnika na forumu :: 115 registrovanih, 10 sakrivenih i 1098 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: 357magnum, A.R.Chafee.Jr., AF-1, ALBION101, amaterSRB, armor, Arsenije, babaroga, Batinas, bigfoot, Boris Bosiljčić, Boris90, Brada i Gibanica, brundo65, Bubili, Buda Baba, ccoogg123, cemix, chica, cinoeye, darkstar101, Dava, dejanbenkovic, Denaya, DH, Djokislav, DonRumataEstorski, draganl, dragoljub11987, dragonserbia, flash12, Gama, Georgius, gmlale, GogiA, gomago, gorval, hatman, helen1, Herman Terrance Aubrey, ILGromovnik, Ilija Cvorovic, Imperator41, Ivan Campo, ivica976, JOntra, Komentator, komkom, Konda, konstruktor, Koridor, Kriglord, krlebgd77, Krusarac, Lazarus, Leonardo, Ligavesh, ljuba, Lord Nem, lovac12, maiden6657, MarKhan, mačković, mercedesamg, mikki jons, milimoj, MilosKop, mkukoleca, nebojsag, nedeljkovici, nemkea71, nenad_l, nermin.opankovic, nevjerna beba, Outis, Panter, Parker, pedja2506, pein, Pohovani_00, popzex, proka89, proleter373, raptorsi, ras007, RileHecr, RobinHood12, Rocker, ruso, S2M, sasabanjac, savaskytec, slonic_tonic, spektorsky, StefanNBG90, Stoilkovic, Tas011, Toni, trundle, trutcina, upitnik, vasa.93, vaso1, vathra, Viceroy, VJ, Vlada1389, vladas87, vladetije, vobo, vukovi, Vule, zixmix, zlatkoa987, |_MeD_|