Matematické Fórum

Nevíte-li si rady s jakýmkoliv matematickým problémem, toto místo je pro vás jako dělané.

Nástěnka
22. 8. 2021 (L) Přecházíme zpět na doménu forum.matweb.cz!
04.11.2016 (Jel.) Čtete, prosím, před vložení dotazu, děkuji!
23.10.2013 (Jel.) Zkuste před zadáním dotazu použít některý z online-nástrojů, konzultovat použití můžete v sekci CAS.

Nejste přihlášen(a). Přihlásit

#1 22. 12. 2014 09:28

HaroldENG
Zelenáč
Příspěvky: 3
Reputace:   
 

Matlab - filtrování matice

Čau,

Potřeboval bych z matice 39x3, kde jsou sloupce věk, mzda a počet osob odfiltrovat podle prvního sloupce, tedy věk, který je větší než 20 a zárověň menší než 30 jedntlivé řádky a aby se uložili do nové matice, která odpovídá této podmínce.

V podstatě bych potřeboval nějakou podmínku(příkaz), který/á dokáže fíltrovat řádky matice podle toho, jaké číslo je v prvním sloupci.

Offline

 

#2 22. 12. 2014 16:37 — Editoval O.o (22. 12. 2014 16:38)

O.o
Veterán
Příspěvky: 1402
Reputace:   16 
 

Re: Matlab - filtrování matice

↑ HaroldENG:

Ahoj,

muzes to udelat vice zpusoby, nejprve navrhnu jeden, ktery nevyzaduje zvlastni znalost prostredi matlabu (je pouzitelny v jakemkoli jinem jazyce a asi by mel byt prvni, ktery te napadl at delas s matlabem nebo programujes v jinem jazyce).
Jako druhy uvedu matlab specificky zapis, ktery vse zkrati, ale neni samostatne rpenositelny do jinych prostredi (jazyku).

(i) princip: cyklus + if podminka
    a/ udelej si cyklus, ktery probehne celou matici
    b/ zaved do neho podminku, kterou potrebujes
        -  v pripade uspechu, prirad cely radek do nove matice
    (sledovat pozici v nove matici muzes pomoci promene, ktera ti bude pocitat kolik radku jsi prenesl)

(ii) neni moc co vysvetlovat, princip je obdobny jako u (i) akorat je to v matlabu zabalene k snadnejsimu pouziti.




Pro pouziti v tvem pripade uz to zvladnes spravne prepsat?

Offline

 

#3 22. 12. 2014 21:54

Martin226
Zelenáč
Příspěvky: 2
Reputace:   
 

Re: Matlab - filtrování matice

Ahoj,

Jedna drobnost, která mi dělala paseku byla v tom kodu: fMatrix = oMatrix(oMatrix(:,end) > 4, :);

Kde ty jsi v podstatě indexoval matici pro všechny sloupce, tudíž mi to vyfiltrovalo méně hodnot. Stačilo to přepsat jako fMatrix = oMatrix(oMatrix(:,1) > 4, :); a vše šlapalo jak mělo.  :-P

Další věc, kterou jsem nevěděl byla jak udělat podmínku aby to vyhazovalo hodnoty větší než 20 a zároveň menší než třicet. Ty jsi tam napsal že to vyhodi hodnoty větší než 4 a já tam zkoušel různě nacpat 30 < ale bez výsledku.

To jsem vyřešil tím samým kódem fMatrix = oMatrix(oMatrix(:,end) < 30, :); a poté jsem pomoci příkazu c = intersect(a, b, 'rows'); udělal průnik těmi maticemi a bylo po problému.

Celkový skript mi vyšel na 55 řádku. Věřím, že pomocí while a if by to bylo mnohem kratší ale já jsem mizerný programátor a opravdu mě nenapadla žádná podmínka, kterou bych tam dal.

=) Ještě jednou díky, moc jsi mi pomohl. (=

Offline

 

#4 22. 12. 2014 22:55 — Editoval O.o (22. 12. 2014 23:02)

O.o
Veterán
Příspěvky: 1402
Reputace:   16 
 

Re: Matlab - filtrování matice

↑ Martin226:

Ahoj,

priklad jsme napsal jen ilustrativni, jak pouzit, je tady takovym pravidlem, ze ti lide radeji daji postouchnuti a ty udelas dalsi praci a dale se o tom pripadne bavi, abys z toho neco mel ty ;-).

Muj priklad rozhodoval podle posledniho sloupce. Nova matice byla tedy sestavena z radku puvodni matice, ktere meli posledni hodnotu v radku vetsi jak ctyri. Proto jsem to puvodne napsal trochu obecne, abys vedel, kam si dosadit sloupce pro rozhodovani a podminku a dale jen uvedl, jak to pouzit na prikladu.

Pro tebe samozrejme uvedu s radosti dalsi tip, s kterym to zjednodusis.
Pokud mas slozitejsi podminku, tak se pouzivaji logicke operatory (and &, or |), s kteryim to slozis, takze muj priklad upraveny:

Code:

% original matrix
oMatrix = [1,2,3;4,5,6;7,8,9;1,2,3;4,5,6;7,8,9];
% filtered matrix by elements which are greater than 4 in the last column of original matrix
fMatrix = oMatrix(oMatrix(:,end) > 3 & oMatrix(:,end) < 9, :);
% vysledna matice bude vypadat takto:
% 4, 5, 6
% 4, 5, 6

Takze pokud chces ty mit vek vetsi nez 20 a mensi nez 30, tak uz urcite vidis, kam ta cisla do podminky zapsat, abys dostal ten spravny vysledek, ze? ;-)
55 radku predpokladam, ze je tvuj cely program, to filtrovani je otazka jednoho radku, jak vidis. S cyklem by to vyslo na vice radku, nez kdyz vyuzijes matlab prirozeny vstup jako jsem tu napsal vyse ;-).

EDIT:
Jeste odkaz na cesky text s operatory, ale jinak doporucuji napovedu v matlabu, nenajdes programovaci jazyk, ktery by mel lepsi manual nez help v matlabu, zadej si vyhledat 'logical operator' a jsi doma, jak Jezisek na Vanoce! ;-)

PS: Pokud mas trable s kodem, tak se neostychej zase ozvat.

Offline

 

#5 23. 12. 2014 05:18

Martin226
Zelenáč
Příspěvky: 2
Reputace:   
 

Re: Matlab - filtrování matice

Super, já místo operátoru "&" psal "and" a nefungovalo to. Tak jo, celkový skript na 42 řádku to už je lepší a taky jsem se zbavil 8 proměnných hodnot.

V matlabu už asi pomoc potřebovat nebudu, nicméně mám ještě za úkol modelovat stejnosměrný motor v simulinku a pomoci osciloskopu zobrazit průběh otáček a proudu. Mám k tomu nějaké skripta, takže to snad nějak zvládnu.

Díky za pomoc. :)

Offline

 

Zápatí

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson