Kier. MTR Programowanie w MATLABie Laboratorium Ćw. 7 Import i eksport danych. Współpraca z plikami zewnętrznymi 1. Wprowadzenie Eksport i import danych w MATLABie Na zakładce menu HOME w sekcji VARIABLE dostępna jest opcja Import Data (można ją także uruchomić poleceniem uiimport). Dzięki niej dostępny jest specjalny kreator, za pomocą którego możliwy jest import danych z plików zewnętrznych do przestrzeni roboczej MATLABa. Obsługiwane są m. in. pliki tekstowe, skoroszyty MSExcel oraz pliki graficzne, audio i video. Opcja Save Workspace pozwala na zapisanie w binarnym pliku *.mat wszystkich zmiennych aktualnie znajdujących się w przestrzeni roboczej. Pliki *.mat zawierają skompresowane, binarne dane pozwalające na późniejsze odtworzenie zawartości zmiennych z pełną precyzją. Zapis i odczyt danych z wykorzystaniem poleceń save i load Istniejące w przestrzeni roboczej MATLABa zmienne są z niej usuwane po wydaniu polecenia clear all bądź po zakończeniu działania programu. Chcąc zachować wszystkie zmienne znajdujące się aktualnie w przestrzeni roboczej należy użyć polecenia save nazwa_pliku w postaci funkcyjnej: save ( nazwa_pliku ) Zmienne zapisywane są na dysku w pliku o rozszerzeniu.mat. Pominięcie nazwy pliku, czyli save powoduje, że wszystkie zmienne są zapamiętane w pliku matlab.mat, utworzonym w aktualnym katalogu. Format plików mat stosowany w najnowszych wersjach programu jest inny od tego, który być stosowany w starszych wersjach. Chcąc zapisać dane w formacie akceptowalnym przez starsze wersje należy użyć odpowiedniego parametru ('-v7.3', '-v7', '- v6', '-v4'). Jeżeli mają być zapamiętane jedynie wybrane zmienne, to należy po nazwie pliku dodać nazwy tych zmiennych save nazwa_pliku zmienna1 zmienna2 zmienna3 save ( nazwa_pliku, zmienna1, zmienna2, zmienna3 ) Chcąc zapisać wartości wybranych zmiennych w pliku tekstowym ASCII należy zastosować polecenie save nazwa_pliku zmienna1 zmienna2 zmienna3 ascii save ( nazwa_pliku, zmienna1, zmienna2, zmienna3, -ascii ) Spowoduje to zapamiętanie zmiennych w pliku tekstowym ASCII przy wykorzystaniu 8- cyfrowego zapisu liczb. Zapisane zmienne tworzą tablice liczb umieszczonych jedna pod drugą, a nazwy zmiennych są pomijane. Możliwe jest także dopisanie zmiennej do już istniejącego pliku. Operację taką można wykonać stosując polecenie save nazwa_pliku zmienna append 1
save ( nazwa_pliku, zmienna, -append ) Wczytanie danych z pliku dyskowego do pamięci roboczej MATLABa realizowane jest poleceniem load nazwa_pliku load ( nazwa_pliku ) Jeśli nazwa pliku zostanie pominięta load to dane zostaną odczytane z pliku matlab.mat. Za pomocą polecenia load ( nazwa_pliku, zmienna1, zmienna2 ) można z pliku *.mat wczytać do przestrzeni roboczej tylko wybrane zmienne, bez konieczności ładowania wszystkich zmiennych zapisanych w tym pliku. Polecenie load nazwa.rozszerzenie zm = load ( nazwa.rozszerzenie ) wczytuje zmienne zapamiętane w pliku tekstowym o podanej nazwie z rozszerzeniem. Wczytane dane zostaną zapamiętane w macierzy o nazwie takiej jak nazwa pliku jak w drugim przypadku podstawione pod zmienną zm. Przykładowo polecenie load dane.dat powoduje utworzenie w przestrzeni roboczej zmiennej od nazwie dane i podstawienie pod nią danych odczytanych z pliku. Polecenie load nazwa_pliku acsii umożliwia wczytanie macierzy z pliku tekstowego, którego nazwa nie zawiera rozszerzenia (podanie samej nazwy pliku bez opcji ascii spowodowałoby poszukiwanie pliku binarnego *.mat). Praca z formatowanymi plikami tekstowymi Otwarcie i zamknięcie pliku W praktyce często występuje problem wymiany danych między programami za pośrednictwem odpowiednio sformatowanych plików tekstowych. Przed wykonaniem operacji plik musi być otwarty, a po ich zakończeniu zamknięty. Otwarcie pliku dokonuje się za pomocą polecenia fid = fopen(nazwa_pliku, sposób_otwarcia) gdzie nazwa_pliku - nazwa otwieranego pliku; jeśli jego lokalizacja jest inna niż roboczy katalog, należy podać pełną ścieżkę dostępu, sposób_otwarcia jest jednym z następujących łańcuchów znakowych określających sposób otwarcia pliku: 'r' - tylko do odczytu (domyślny), 'w' - tylko do zapisu; jeśli plik istnieje jego dotychczasowa zawartość zostanie utracona, jeśli nie istnieje, zostanie utworzony nowy plik, 'a' - tak jak w, z tym, że nowe dane dołączane są do danych już zapisanych w pliku, 'r+' - do odczytu i zapisu bez możliwości utworzenia pliku, jeśli plik nie istnieje, 'w+' - do odczytu i zapisu z możliwością utworzenia pliku, jeśli plik nie istnieje; jeśli plik istnieje jego dotychczasowa zawartość zostanie utracona, 2
'a+' - tak jak w+, z tym, że nowe dane dołączane są do danych już zapisanych w pliku. Domyślnie pliki są otwierane w trybie binarnym. Aby otworzyć plik tekstowy należy dodać 't' do łańcucha sposób_otwarcia, np. 'rt' - czytanie pliku tekstowego 'wt' - zapisywanie do pliku tekstowego Należy pamiętać, że otwarcie istniejącego pliku w trybie do zapisu spowoduje utratę jego dotychczasowej zawartości. Gdy zmienna fid przyjmuje wartość 1, oznacza to, że otwarcie nie powiodło się. Przy wywołaniu [fid, komunikat] = fopen(nazwa_pliku, sposób_otwarcia) zmienna komunikat zwraca opis błędu. Operację zamknięcia pliku realizuje polecenie status = fclose(fid) Zmienna fid będąca parametrem fclose oznacza identyfikator pliku, którego wartość określono za pomocą fopen. Pomyślne wykonanie polecenie powoduje, że zmienna status = 0, w przeciwnym wypadku status = 1. Polecenie status = fclose('all') służy do zamknięcia wszystkich aktualnie otwartych plików oprócz tych, które posiadają fid równe 0, 1 2. Zapis do formatowanego pliku tekstowego Do zapisywania danych do sformatowanego pliku tekstowego służy znana z języka C funkcja ilosc = fprintf(fid, format, A,...) Dane, którymi są zawartości zmiennych umieszczonych na liście parametrów (A, ) zapisywane są do pliku tekstowego o identyfikatorze fid (zwróconego przez wcześniejsze wywołanie fopen) zgodnie ze specyfikacją podaną w format. Funkcja pod zmienną ilosc zwraca liczbę poprawnie zapisanych na dysku bajtów. Parametr format jest łańcuchem zgodnym ze specyfikacją znaną z języka C i w ogólnym przypadku składa się z następujących elementów: %flaga szerokość pola.liczba_wyprowadzanych_znaków(liczb) typ_argumentu) flaga może być znakiem: o (minus): napis jest wyrównywany lewostronnie w polu wyjściowym, uzupełniony z prawej strony spacjami, o + (plus): napis liczbowy jest zawsze poprzedzony znakiem plus albo minus, o spacja oznacza, że napis liczbowy jest poprzedzony znakiem minus albo spacją, stosownie do wartości argumentu, o 0 uzupełnienie zerami pól, gdy zapis liczby jest krótszy niż szerokość pola, szerokość_pola jest minimalną szerokością pola, w którym zostanie umieszczony napis; szerokość pola może być określona liczbowo albo za pomocą znaku * (szerokość pola określi wówczas kolejny argument typu całkowitego), liczba_wyprowadzonych_znaków określa minimalną liczbę cyfr po przecinku. Jeżeli wystąpi *, to dokładność jest określana przez następny argument funkcji, który musi być typu całkowitego. typ_argumentu jest jednoliterowym kodem konwersji, określającym sposób utworzenia napisu stanowiącego pole pliku. Wybrane kody konwersji zawiera tab. 1. 3
Tab. 1. Kody konwersji funkcji fprinft( ) Kod konwersji Typ argumentu Opis %d int liczba dziesiętna %i int liczba dziesiętna %o int liczba ósemkowa bez znaku %u int liczba dziesiętna bez znaku %x int liczba szesnastkowa bez znaku %X int jw. (wielkie litery A-F) %f double liczba stałopozycyjna %e double liczba zmiennopozycyjna %E double liczba zmiennopozycyjna %g double liczba zmiennopozycyjna (bez dodatkowych zer) %G double liczba zmiennopozycyjna (bez dodatkowych zer) %c char znak %s string łańcuch znakowy Ponadto w łańcuchu formatującym mogą wystąpić znaki \n nowy wiersz \r powrót karetki \t tabulacja \b cofnięcie \f nowa strona Jeśli pominie się w funkcji fprintf zmienną z identyfikatorem pliku, wtedy tekst sformatowany zostanie wyświetlony na ekranie (tj. w oknie poleceń), jako standardowym urządzeniu wyjścia. Jeśli zmienna na liście parametrów funkcji fprintf jest wektorem macierzą jest ona wywoływana tyle razy, aby wyświetlić wszystkie elementy. W przypadku macierzy elementy wyświetlane są kolumna po kolumnie. Odczyt danych z formatowanego pliku tekstowego Do odczytu danych ze sformatowanego, otwartego pliku tekstowego służy polecenie C = textscan(fid, spec_format) gdzie: C tablica komórkowa z odczytanymi danymi, fid identyfikator zmiennej plikowej, format specyfikacja formatu odczytywanych danych. Jeśli znana jest liczba powtórzeń odczytów n, wtedy można użyć polecenia: C = textscan(fid, spec_format, n) Funkcja posiada także możliwość podawania dodatkowych parametrów przetwarzania tekstu za pomocą C = textscan(fid, spec_format, nazwa1, wartosc1, nazwa2, wartosc2, ) Przykładowe nazwy parametrów i ich znaczenie podano w tab. 2. 4
Tab. 2. Wybrane parametry funkcji textscan Nazwa pola HeaderLines 'Delimiter' CommentStyle 'EmptyValue' Opis Liczba początkowych linii nagłówków danych pomijanych przy przetwarzaniu Określenie znaku separatora danych Znak komentarza tekst po nim umieszczony zostanie pominięty przy przetwarzaniu Określenie domyślnej wartości w przypadku obecności pustego pola danych Wymiana danych między MATLABem i MSExcel Dane w skoroszytach MSExcel mogą być importowane do za pomocą polecenia: zm = xlsread( nazwa_pliku, nazwa_arkusza, zakres ) gdzie: zm nazwa zmiennej w przestrzeni roboczej przechowującej dane ze skoroszytu, nazwa_pliku nazwa pliku skoroszytu; nazwa_arkusza nazwa arkusza w skoroszycie; zakres adres zakresu komórek w arkuszy, który należy importować. Eksport danych z przestrzeni roboczej MATLABa do MSExcel realizuje polecenie xlswrite( nazwa_pliku, nazwa_zmiennej) gdzie: nazwa_pliku nazwa pliku skoroszytu, nazwa_zmiennej nazwa eksportowanej zmiennej. Polecenie to można także uzupełnić o nazwę arkusza i zakres do którego dane mają zostać zapisane. Wymiana danych z poziomu MSExcel wymaga instalacji dodatku Spreadsheet Link. 2. Ćwiczenie laboratoryjne Przeanalizować działanie funkcji save i load na przykładzie oraz m-pliku frkw. 3. Zadania laboratoryjne 1. Zapisać do wynikowego, sformatowanego pliku tekstowego wartości miejsc zerowych wielomianu, którego współczynniki odczytywane są z wejściowego pliku tekstowego (plik tekstowy ze współczynnikami utworzyć wpierw np. za pomocą Notatnika). Do znalezienia pierwiastków użyć funkcji roots(p), gdzie p jest wektorem współczynników wielomianu (sposób jej użycia jest podany w systemie pomocy). Uwzględnić przypadek, gdy pierwiastkami są liczbami zespolonymi - wtedy oddzielnie zapisać do pliku ich część rzeczywistą i urojoną. W pliku wynikowym powinny znaleźć się także współczynniki wielomianu. 2. Napisać program, który odczytane dane liczbowe zapisane w pliku tekstowym wyniki.dat, a następnie przedstawić je na wykresie wraz z podaniem wartości minimalnej, maksymalnej i średniej w zbiorze danych. Użyć funkcji textscan( ) z odpowiednimi parametrami. 3. Napisać program generujący wektor n całkowitych liczb losowych z rozkładzie równomiernym w zakresie 0-100. Do pliku tekstowego zapisać dane dotyczące ilości liczb w przedziałach [0; 20), [20; 40), [40; 60), [60; 80), [80; 100] oraz wartości tych liczb. Przykładowa zawartość pliku wynikowego: Wektor: [ 12 45 9 91 38] Przedz. Ilosc Liczby 0 20 2 12, 9 20 40 1 38 40 60 1 45 60 80 0 80 100 1 91 5