Page 1 of 2

IT ØVING 9 - En del sprøsmål

Posted: 02/11-2011 20:33
by Nebuchadnezzar
Sliter litt med denne øvingen, alle tips og tilbakemeldinger godtas med stor takknemmlighet.

Øving 9

http://itgk.idi.ntnu.no/oving/oving9-matlab.pdf

http://itgk.idi.ntnu.no/oving/exercise2.txt

http://itgk.idi.ntnu.no/oving/timeplan.csv

Sliter merkelig nok med alt.

Klarer ikke lese inn filen ovenfor med den "korrekte måten"
bruker

Code: Select all

>> h = load(exercise2.txt)
??? Attempt to reference field of non-structure array.
 
>> h = load(exercise2.txt,''-ascii'')
??? Attempt to reference field of non-structure array.
 
Klarer derimot å laste filen om jeg skriver bare

Code: Select all

load exercise2.txt,
Hva skjer?

Videre så skal jeg lage en funksjon, om sorterer og systematiserer. Dette ble vanskelig! Altså 2c, tenkte den var lettere enn 2b. Her er koden min som ikke fungerer.

Code: Select all

clear all
clc

load exercise2.txt

a = sort(exercise2(:))     % omgjør matrisen til en vektor med stigende verdi
b = length(a);             % Finner lengden til denne vektoren
k=1;
d(k,1)=a(1,1)
d(k,2)=0

for i = 1:(b-1)
    if a(i,1)==a(i+1,1)    % Sammenligner to ledd
    d(k,2) = d(k,2) + 1;   % Dersom disse er like teller                                 % funksjonen en opp
    else
    k = k + 1;             % Dersom tallene ikke er like går                             % funksjonen videre
    d(k,1)=a(i,1);         % Går til neste rad, og setter                               % det første elementet
    end                    % Likt som a.
end

d
Blir riv ruskende galt. Videre sliter jeg med resten av øvingen og ... =(
sittet noen timer nå, og prøvd på alt mulig rart. Noen som kan hjelpe?

Posted: 02/11-2011 21:31
by drgz
1) load exercise.txt eller
2) load('exercise.txt')

Code: Select all

load exercise2.txt;
A = exercise2;
[m n] = size(A);
Av = A(:);
B = unique(Av);
C = zeros(numel(B),1);
fid = fopen('nyfil.txt','w');

for k = 1:numel(B)
    C(k) = numel(find(Av==B(k)));
end
fprintf(fid,'%d: %d\n',[B C]);
fclose(fid);

Posted: 02/11-2011 22:21
by drgz
4a)

Code: Select all

function tp = tpTilCell(fil)
[fid err] = fopen(fil,'r');
if ~isempty(err)
    error(err);
end
tp = cell(8,5);
d = 1;
while ~feof(fid)
    str = fgetl(fid);
    strc = regexp(str,',','split');
    tp(:,d) = strc;
    d = d+1;
end
fclose(fid);
end
4b)

Code: Select all

function tp = settTidspunkt(tptab,dag,tidsp,fag)
tp = tpTilCell(tptab);
tidsp = tidsp-7;
if numel(tidsp) > 1
    tp(tidsp,dag) = repmat({fag},numel(tidsp),1);
else
    tp(tidsp,dag) = fag;
end
Gjør ingen sjekker på input, men regner med at det ikke kreves.

Resten får du vel til selv? :)

Burde nesten ta ITGK med MATLAB selv. Synd vi bare hadde ubrukelig jsp den gang jeg hadde det.

Posted: 02/11-2011 22:28
by Nebuchadnezzar
Nå tror jeg at jeg fikk til 2c. Klr meg ihodet, litt fordi du gjør ting helt annerledes enn vi har lært. Vi lærer myyye løkker vi. Men jeg er oppegående, så klarer å tweake ting litt.

Denne burde fungere for 2b)

Code: Select all

clear all
c3;
clc
i = 1;

h

while numel(C)>10
    
    if C(i)==min(C)
    C(i)=[];
    B(i)=[];
    end
    i = i + 1;
end

k = [ B , C ]
Litt baklengs å først gjøre 2c, også bruke det til å gjøre 2b. Men jaja. Skal vi se på de neste oppgavene da. Tusen takk for hjelpen. Kommer ikke til å skrive av, da jeg er forferdelig dårlig til å koke. Men skal se over nøye ^^

EDIT: Forstod absolutt null av 4a. Ser at omtrent absolutt alt av funksjoner og kommandoer er nytt for meg. Eneste jeg ser at du gjør er at du lager en tabell, og skjører en while løkke. Testet også funksjonen og den ville ikke kjøre... Sikkert bare meg som gjør noe galt, men dette er litt frustrerende.

Posted: 02/11-2011 22:32
by drgz
Jo tidligere du innser at løkker i MATLAB ikke er effektivt i MATLAB, jo bedre. Selvsagt, noen ganger må du ha det uansett, men det beste er som regel å unngå det hvis du kan.

Nå vet jeg ikke hva av funksjoner dere har lov til å bruke på eksamen, vil f.eks alle innebygde funksjoner være lov så lenge de ikke spesifiserer at dere skal skrive funksjonen fra scratch?

Posted: 02/11-2011 22:44
by Nebuchadnezzar
Alt er lov på eksamen ja, så lenge ikke annet står spesifisert. Tenker at jeg gjerne kan bruke avanserte funksjoner. Men da må jeg lære meg å bruke disse først.

For eksempel har vi brukt

Code: Select all

length(b)
og ikke

Code: Select all

enumel(b)
osv osv.

Du gjør også noe merkelig med å åpne og lukke noen tekst filer, som jeg finnersvært merkelig... Jaja... Kanskje det ikke er meningen at jeg skal forstå alt heller =(

EDIT: Nå kjørte koden din, skal lese gjennom den med lupe. Selv om alt ser gresk ut foreløpig. Mener 4a. 2`en er grei :D

Posted: 02/11-2011 22:47
by drgz
Hvordan kjører du koden da? Tanken er at du kjører den ved å skrive f.eks A = tpTilCell('filnavn.type').

Ellers kan jeg sikkert skrive hva som skjer i koden

Code: Select all

[fid err] = fopen(fil,'r'); % Åpne fil gitt som input
if ~isempty(err) % sjekk om fopen klarer å åpne
    error(err); % hvis ikke, gi feil og stopp koden
end
tp = cell(8,5); % init. cell-array
d = 1; % teller
while ~feof(fid) % så lenge du ikke har nådd siste linje
    str = fgetl(fid); % leser du ut linje for linje og lagrer til str-variabel
    strc = regexp(str,',','split'); % split innhold i str-variabel på alle komma
    tp(:,d) = strc; % og lagre strc (cell-array) som kolonner i tp
    d = d+1; % inkrementer teller
end % end while
fclose(fid); % lukk fil
end % end function

Posted: 02/11-2011 22:51
by drgz
Nebuchadnezzar wrote:Alt er lov på eksamen ja, så lenge ikke annet står spesifisert. Tenker at jeg gjerne kan bruke avanserte funksjoner. Men da må jeg lære meg å bruke disse først.

For eksempel har vi brukt

Code: Select all

length(b)
og ikke

Code: Select all

enumel(b)
osv osv.
numel() og length() er i to sider av samme sak for Nx1 eller 1xN vektorer, se http://stackoverflow.com/questions/3119 ... -functions . Jeg burde nok ha gått over til mer konsekvent bruk som de skriver på SO, men har bare blitt en vane. :S
Nebuchadnezzar wrote: Du gjør også noe merkelig med å åpne og lukke noen tekst filer, som jeg finnersvært merkelig... Jaja... Kanskje det ikke er meningen at jeg skal forstå alt heller =(
Trodde fopen og fclose var pensum jeg (mener å ha lest det på den NTNU tråden på diskusjon.no)
Nebuchadnezzar wrote: EDIT: Nå kjørte koden din, skal lese gjennom den med lupe. Selv om alt ser gresk ut foreløpig. Mener 4a. 2`en er grei :D
:)

Posted: 02/11-2011 23:05
by Nebuchadnezzar
Er sikkert pensum, men jeg / vi har ikke lært det enda.

I kveld er første gang jeg prøver å hente inn informasjon fra filer i matlab, og ærlig talt så er 80% av funksjonene du brukte i koden din, koder jeg aldri har sett før. Men det er jo slikt en lærer av.

så ja, nå leser jeg meg opp på hvordan jeg skal lage menyer og slikt, som vi heller ikke har hatt om før. Blir artig. Står heldigvis litt i boka.

Posted: 10/11-2011 21:49
by Nebuchadnezzar

Code: Select all

clc 
clear all 

fid = fopen('poenggrenser_2011.txt');
data = textscan(fid, '%q %q' , 'delimiter' , ',');

antall = 0;
karakterer = [];

fag     = data{1};
grenser = data{2};

for i = 1:length(grenser)
    if strcmpi(grenser(i), 'alle')
        antall = antall + 1;
        continue
    end
    
    navn = char(fag(i));
    if length(navn) > 4
        if strcmpi(navn(1:4), 'NTNU')
            karakterer = [ karakterer str2double(grenser(i)) ];
        end
    end
end

fclose(fid);
Noen grunn til at denne koden ikke kjører? Er 3b...

Posted: 10/11-2011 22:05
by espen180
Hvis du fjerner semikolonet fra fopen-funksjonen, ser du at du får igjen

Code: Select all

fid= -1 
altså klarer ikke MATLAB å påne filen. Grunnen er at du har skrevet feil filformat. Det skal være .csv, ikke .txt. Hvis du fikser dette, kjører koden problemfritt.

Posted: 10/11-2011 22:07
by Nebuchadnezzar
Får heller ikke 4b til å kjøre

Posted: 10/11-2011 22:16
by espen180
Hvordan ser koden din ut?

Posted: 10/11-2011 22:17
by Nebuchadnezzar
function tp = settTidspunkt(tptab,dag,tidsp,fag)
tp = tpTilCell(tptab);
tidsp = tidsp-7;
if numel(tidsp) > 1
tp(tidsp,dag) = repmat({fag},numel(tidsp),1);
else
tp(tidsp,dag) = fag;
end

Posted: 10/11-2011 22:29
by espen180
Det eneste jeg ser er at linje 7 burde være

Code: Select all

tp(tidsp,dag) = {fag}; 
gitt at tp er en cell array og fag er en streng. Ellers vil du vel få en error om konversjon fra cell til char klasse.