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
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
og ikke
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

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
og ikke
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


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
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
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.