MatLab - Analiza plików *.m

0

Pisał ktoś z was skrypty w MatLab'ie??

Chodzi o to, że mam zgrany poprawny (zakładam) plik/skrypt *.m
do tablicy fb (cell array) tak, że kolejne wersy pliku są w kolejnych komórkach fb{1}, fb{2}, ..., fb{n}.
Skrypt który pisze ma stworzyć tablice zm (cell array) zawierającą nazwy zmiennych ort! w skrypcie zawartym w fb i vektor v (double array) zawierający index'y tablicy fb takie, że jeżeli dodamy tam nowy wers:

fb=[fb(1:v(i)) {['disp(''text' int2str(i) ''')']} fb(v(i)+1:end)];

to dla każdego i=1:length(v) odpowiadający mu text wyświetli się dokładnie raz po uruchomieniu sktyptu ze zmiennej fb (z dowolnymi parametrami)</span>

0

To będzie arcytrudne z tego powodu, że w Matlabie nie ma jak rozróżnić, czy dana linijka zawiera inicjację zmiennej. A że zmiennych się tu nie deklaruje, więc jest problem. Rozważ taki przykład:

1: sin(1)
2: sin(1) = 2
3: sin(1)

W linii 1 wywołana zostaje fukcja obliczająca sinus z jednego radiana. Wynikiem będzie 0.8415
W linii 2 następuje utworzona zmienna tablicowa sin i pod jej element o indeksie 1 zostaje podstawiona wartość 2
W linii 3 następuje wypisanie wartości ze zmiennej sin i na ekranie widzimy 2 a nie spodziewane 0.8415

To jeden z wielu przykładów, z którym skrypt miałby duży problem z rozróżnieniem co jest co i kiedy.

Niestety - nie pomogę Ci w napisaniu takowego, gdyż mam wiele projektów na głowie - i w sumie wątpię, abyś znalazł tu kogoś, kto Ci pomoże... ale obym się mylił.

Good luck (you will be need it)

0

Akurat z listą ort! nazw zmiennych nie ma aż tak wielkiego problemu:
Wystarczy tylko odnajdywać operatory przypisania '='.
Jesli tworzymy zmienną w MatLabie to musi zostać nadana jej wartość ;)
A chodzi tylko o odnalezienie zarezerwowanych ort! nazw :)
to w twoim przykładzie mamy:

1: sin(1)
2: sin(1)=2
3: sin(1)

Skrypt odnalazłby operator '=' w 2'giej linijce i podejzewałby, że to co jest przed nim definiuje nazwę zmiennej;
Należy jeszcze zauważyć, że jeżeli nie ma żadnych nawiasów to nazwa zmiennej kończy się przed pierwszym napodkanym białym znakiem (a jeżeli są nawiasy to przed pierwszym białym znakiem po otwarciu wszystkich nawiasów).
czyli należy bliżej przyjżeć się części:

'sin(1)'
Z tego ort! nie jest strasznie trudno wyciągnąc nazwę zmiennej 'sin' ;)

Do takiej listy należałoby tylko dodać nazwy zarezerwowane podczas eventualnej deklaracji funkcji (jeśli plik *.m zawiera funkcje);

Dodam że interesuje mnie lista nazw zmiennych ort! w głównej funkcji M-Pliku jeżeli analizujemy plik funkcyjny.

Dużo gożej jest natomias z detekcją miejsc które będą dokładnie raz wykonywane podczas dowolnego odpalenia skryptu [sciana]
Jest tak z kilku powodów:

1: instrukcja kończąca ort! (itp) - 'end' może równie dobrze oznaczać ostatni element tablicy np:

1: v='Jakis tam text';
2: for i=1:length(v)-1 % poczatek <ort>pentli</ort> <b>for</b>
3:  disp(v(i:end)) % ten <b>end</b> oznacza ostatni element vectora v
4: end % ten <b>end</b> oznacza koniec <ort>pentli</ort> <b>for</b>

2: plik *.m może być plikiem funkcyjnym i może zawierać jednocześnie inne podfunkcje lub funkcje zagnieżdżone i wtedy to dopiero się robią problemy ze znaczeniem po<ort>szczegulnych</ort> 'end'ów</span>

ps: Nie wiem dlaczego mimo, że jestem zalogowany moje ostatnie posty są wyświetlane jako Anonimowe :(
Sebo

// bo piszesz je dłużej niż 15 minut i system Cię wylogowuje - Ł
//zaloguj się permanentnie abyś mógł poprawiać błędy - mało rozumiem z twojego postu - same orty... poza tym ten niebieski powoduje, że raczej nie chce mi się tego czytać - M

0

3: Wykonywanie funkcji można przerwać instrukcją:
return

np:

01: function fx=f(x);

02:  function an=a(n);
03:   if all(n>0)
04:    an=0;
05:    return;
06:   end
07:   an=sin(n);
08:  end

09:  if x>0
10:   fx=1;
11:   return;
12:  end
13:  fx=prod(a(1:x));
14: end

Ale jak pokazuje powyższy przykład wystąpienie 'return' w ciele funkcji nie musi oznaczać miejsca gdzie skrypt może się zakończyć << może ono przerywać funkcję zagnieżdrzoną :P

0

Dobra... kwestję tablicy zm w pewnym sensie ju_sz rozwiązałem :)
Okazało się ze nie jest mi ona aż tak potrzebna :D
Ale pozostało szukanie miejsc, które są wykonywane dokładnie raz [sciana]
Ktoś ma jakieś pomysły??

---==< 'ort!' są bez sensu >==---
np ten kod przecież jest poprawny:

function <ort>jusz=pentle(konec,urzyte);</ort>
for <ort>kture=1:konec;</ort>
<ort>jusz=sum(ktore:urzyte);</ort>
end;

A niech mi ktos bez zagladania powie o <co?> tu chodzi :>

1 użytkowników online, w tym zalogowanych: 0, gości: 1