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
Č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
↑ 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.
Offline
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
↑ 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:
% 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
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