Page 1 of 2

Array of arrays (Matlab)

Posted: 04/10-2012 12:23
by Nebuchadnezzar
Har en lang rekke arrays som ser ut noenlunde som dette

Code: Select all

cm = {315,700,'Captain Morgan',37.5};
rom = {205,400,'Rom',30};

for i=1:2
   fprintf('\n      Alkoholkomponent nr. %d \n',i);
   c = input('Alkoholtype: ');
   d = input('Volum [cl]: '); 
end

fprintf('\n Pris      cl    Navn     Prosent         pris/cl    \n') 
for j=1:2
    
end
Jeg ønsker å få ut en liste av alle alkoholkomponentene jeg har brukt. Prøvde litt for forskjellig, for eksempel

g{j} = c

eller

g(i , 1) = { c}

Men ingen av disse to fungerte. Skriver jeg

Code: Select all

cm = {315,700,'Captain Morgan',37.5};
rom = {205,400,'Rom',30};

for i=1:2
   fprintf('\n      Alkoholkomponent nr. %d \n',i);
   c = input('Alkoholtype: ');
   d = input('Volum [cl]: '); 
g(i,1) = {c}
end

fprintf('\n Pris      cl    Navn     Prosent         pris/cl    \n') 
for j=1:2
g(j,1)    
end
Får jeg bare ut tull, noen effektiv måte å hente ut informasjonen på ?

Posted: 04/10-2012 13:06
by Emilga
Matlab bruker hakeparenteser [] i initialisering av matriser:

a = [2, 3, 4];

Og så bruker det vanlige parenteser for å hente ut elementer (1-indeksert):

a(1) = 2.

For:
g(i,1) = {c}

trenger du ikke ha noen parenteser rundt c.

Posted: 04/10-2012 14:57
by drgz
Hvis du kan bruke structs i stedet så er det ganske rett frem å hente ut data:

Code: Select all

st(N).('pris') = 0;

for i = 1:N
   fprintf('\n      Alkoholkomponent nr. %d \n',i);
   st(i).('type') = input('Alkoholtype: ','s'); 
   st(i).('volum') = input('Volum [cl]: ');
   st(i).('prosent') = input('Prosent [%]: ');
   st(i).('pris') = input('Pris [kr]: ');
end
og

Code: Select all

fprintf('\n Pris      cl    Navn     Prosent         pris/cl    \n') 
for i = 1:N
    fprintf('\n %.2f      %.2f    %s     %.2f         %.2f    \n',st(i).pris,st(i).volum,st(i).type,st(i).prosent,st(i).pris/st(i).volum);
end
Ellers, hvis du absolutt vil bruke cell-arrays kan du ha noe ala

Code: Select all

g = cell(2,1);
for i=1:2 
   fprintf('\n      Alkoholkomponent nr. %d \n',i); 
   c = input('Alkoholtype: ','s'); 
   d = input('Volum [cl]: '); 
   g{i} = {c d};
end 

fprintf('\n Pris      cl    Navn     Prosent         pris/cl    \n')
for j=1:2
    [g{j}{1} g{j}{2}]
end 
Hvis du bruker celler, og har en cell-array A med N celler, så vil A(i) gi deg den i'te cellen. Hvis du vil ha innholdet i den samme cellen må du bruke A{i}. Hvis den i'te cellen er en numerisk array, f.eks av dimensjon M, så vil A{i}(k) gi deg det k'te elementet i celle i. Skulle A{i} derimot være en ny celle (som i koden over), så må du bruke A{i}{k} for å hente ut innholdet.

Posted: 04/10-2012 14:59
by drgz
Emomilol wrote:Matlab bruker hakeparenteser [] i initialisering av matriser:

a = [2, 3, 4];
Du bruker også hakeparenteser for å sette sammen strenger, type

a = 'katt'
b = 'og mus'
c = [a ' ' b]

der c vil være 'katt og mus'

Posted: 04/10-2012 19:45
by Nebuchadnezzar
Da forstår jeg litt mer, takker Shannon. Takk til EMilol og.

Om jeg bruker structs eller arrays, er egentlig det samme for meg.

Målet mitt er at jeg fikler litt med et program til en venn som står i en bar.
Selve poenget er å kunne skrive inn ulike flasker eller ingredienser og lagre disse i en liste, for senere og hente ut verdiene igjen.

Code: Select all

% prisliste, alkoholpris per. cl 
%Navn   %Cl Pris	
vdk     = 3.56;	 %Vodka (kalinka)
mick    = 0.43;	 %Mickey Finn (rød og grønn) 
teq     = 4.71;  %Tequila                                 	
bomb    = 4.71;  %Bombay Sapphire Gin                     	
mint    = 4.88;  %Minttu                                  	
xant    = 5.6;   %Xantè                                   	
cm      = 4.2;   %Captain Morgan/Havanna Club                      	
passo   = 2.86;  %Passoa                                  	
bols    = 3.8;   %Bols (Blå og gul)                       	
sambu   = 4.46;  %Sambucca Luxardo                        	
mali    = 3.57;  %Malibu                                  	
razz    = 4.40;  %Bacardi Razz                            	
pis     = 3.05;  %Pisang Ambon (grønn og lilla)                        	
jam     = 4.92;  %Jameson                                 	
peach   = 3.14;  %Peach Tree                              	
bail    = 3.10;  %Baileys/Shannons                        	
jeger   = 5.00;	 %Jaigermeister                           
kalu    = 3.75;  %Kahluà                                  	
amaret  = 4.29;  %Disaronno Amaretto                      	
amarul  = 2.84;	 %Amarula                                 
south   = 4.57;  %Southern Comfort                        	
cac     = 4.42;  %Cachaca                                 	
coin    = 5.35;  %Triple sec/Cointreau                    	
ver     = 2.13;	 %Tørr Vermouth                          
gali    = 5.5;   %Galliano                                	
banan   = 3.7;   %Banan likør (Pisang/Bols)    
hot     = 3.2;   %Hot n'Sweet
mid     = 3.86;  %Midori
lys     = 4.3;   %Lys rom (Havanna Club)

% blandevann
cola = 0.4;      % Coca Cola
brus = 0.3;      % Sprite, fanta osv.
flote = 0.60;    % Fløte 
hel = 0.3;       % Helmelk
oboy = 0.5;      % Oboy
gren = 0.4;      % Grenadine
app = 0.3;       % Appelsinjuice
rlime = 1.1;     % Roses lime
bat = 0.6;       % Battery
ton = 0.5;       % Tonic water
red = 0.8;       % Redbull
sukker = 0.2;    % Sukker
ana = 0.3;       % Ananasjuice


%garnityr
lime = 1.5;  % Lime
sit = 1.0;   % Sitron


% input av ting 
a = input('\n Antall alkoholkomponenter: ');
b = input('   Antall ekstra komponenter: ');
T = 0;
V = 0;

for i=1:a
   fprintf('\n      Alkoholkomponent nr. %d \n',i);
   c = input('Alkoholtype: ');
   d = input('Volum [cl]: '); 
V = d + V;
T = T + c*d;
end

if b>0
for j=1:b
     fprintf('\n    Ekstrakomponent nr. %d \n',j);
   c = input('Ingrediens/blandevann-type: ') ;
   d = input('Volum [cl]: ');
T = T + c*d;
end
end

% 4 cl maks i alkoholvolum
if V<4
B = 35;
else
B = 35 + floor((V-4)/2)*5;  
fprintf('Badekar')
end 

P = 100*(B - T)/T;

% Om fortjenesten er mindre enn 30%, legg på 5 kr. 
while P < 30
    B = B + 5;
    P = 100*(B - T)/T;
end

fprintf('\n Alkohol Volum: %f ',V);
fprintf('\n Forslagspris: %f kroner ',B);
fprintf('\n Fortjenneste: %f kroner ' , B - T);
fprintf('\n Innkjøpspris: %f kroner ',T);
fprintf('\n Prosentvis inntjening: %f %,',P);
fprintf('\n');
clear;
Denne koden fungerer utmerket, men det som er ønskelig er å ha et litt mer avansert system, hvor en kan legge inn flere opplysninger angående hver flaske.

Noe allà

cm = [ navn , flaskepris , Volum , alkoholprosent ]

( Eller kjøre en funksjon som legger dette til i en liste )

forså å kunne få ut opplysningene i koden ovenfor, pluss hvilke flasker drinken inneholder.

Spørsmålet mitt er da, hva er den letteste måten å lagre og hente informasjonen på? Er det lettest å bare skrive en enkel text fil også hente ut opplysninger derfra eller? Syntes selv structs blir litt rotete og tar mye plass om en for eksempel har 50 flasker, og hver flaske krever 5 linjer med informasjon.

Skal prøve litt selv som vanlig, men forslag til kode / psudokode hadde vært artig.

Posted: 04/10-2012 20:10
by Janhaa
blir "tørst" av denne tråden...
dr alk

Posted: 05/10-2012 13:37
by drgz
Nebuchadnezzar wrote:
Noe allà

cm = [ navn , flaskepris , Volum , alkoholprosent ]
Er jo ikke verre enn å ha en funksjon som tar inn et filnavn til en *.mat-fil som inneholder en struct, som lastes, oppdateres, og deretter lagres igjen.

Code: Select all

function addToList(filnavn,navn,flaskepris,volum,alkoholprosent)
% f.eks
%
% addToList('alkoListe.mat','Jack Daniels',400,750,44)
%
load filnavn; % laster en *.mat-fil med en struct, f.eks drikkeListe
N = length(drikkeListe);
drikkeListe(N+1).navn = navn;
drikkeListe(N+1).flaskepris = flaskepris;
drikkeListe(N+1).volum = volum;
drikkeListe(N+1).alkoholprosent= alkoholprosent;
save(filnavn,'drikkeListe');
end
Syntes selv structs blir litt rotete og tar mye plass om en for eksempel har 50 flasker, og hver flaske krever 5 linjer med informasjon.
Henger ikke på greip. Den enkleste løsningen i Matlab for det du vil gjøre er garantert å bruke structs.

Også ganske simpelt å hente ut data hvis du skulle lete etter noe spesielt; f.eks hvis du vil sjekke hva du la inn av informasjon for en flaske Jack, så går det an å kun søke i feltene drikkeListe.navn, og få ut indeksen, n, til det du leter etter slik at du kan få ut all informasjon ved å printe ut drikkeListe(n). Vil du oppdatere er det bare å skrive drikkeListe(n).pris = nypris, osv.

Det er rett frem å bygge opp et lite bibliotek av funksjoner som trengs for å holde en slik liste ved like.

Også bør det nevnes at designet på nyeste versjonen i Matlab er helt for ******. Hva f*** skjer med at alt skal se ut som de nyere versjonene av MS Office (minus fargen). Blæh.

Edit #2: Og hva skjer med at forumet har sensur av ord som f***?

Posted: 05/10-2012 14:22
by Nebuchadnezzar
Takker for svar, da gjør jeg jeg det på din måte, du er sjef!
Poenget mitt var bare at om en skulle skreve structsa selv, og ikke lagt det inn i en funksjon er det mer rotete.

Dette gjør jobben min enklere, takk igjen.

Nå kan jeg slappe av med rom og cola, fordi det endelig er fredag.

Posted: 05/10-2012 16:06
by krje1980
Etter å ha tatt kurs i både Java og MatLab vil jeg påstå at problemstillinger av den typen du har her er mye, mye enklere å løse i Java. Alt som involverer tekst og flerdimensjonelle tabeller er som regel mye mer knotete i MatLab. Så dersom du ikke allerede har erfaring med Java, så kan det være lurt å sette seg litt inn i det grunnleggende. Dersom man kombinerer f.eks. Java og MatLab så har man virkelig at the sky's the limit :).

Det ligger mange fine introduksjonsvideoer til Java av Khanacademy-format på YouTube, så det er bare å sette i gang :).

Posted: 05/10-2012 18:08
by Gustav
Vil det ikke være mye lettere og mer oversiktlig å bruke klassestruktur i Python eller Java (f.eks. superklasse Produkt og subklasser Øl, Whisky, Vin etc som arver fra Produkt)

Posted: 06/10-2012 11:14
by Nebuchadnezzar
Tenker selv at matlab ikke er optimalt, men det å lære meg ett nytt språk, får jeg ta som et hobbyprosjekt i ferien ;)

Jeg har nå laget en matlabfil med navn Alkoliste og følgende innhold

Code: Select all

   drikkeListe(1).kortnavn = 'cm';
   drikkeListe(1).flaske = 'Captain Morgan';
   drikkeListe(1).volum = 70;
   drikkeListe(1).prosent = 37.5;
   drikkeListe(1).pris = 315;
Så tenkte jeg å lage et script som du sier, som legger til flasker til denne lista. Her er hva jeg har prøv så langt

Code: Select all

fprintf('\n')
T = 0;
load 'Alkoliste.m';
N = length(drikkeListe);
while T==0

   drikkeListe(N+1).('kortnavn') = input('Kort navn: ','s');
   drikkeListe(N+1).('flaske')   = input('Navn på flaske: ','s');
   drikkeListe(N+1).('volum')    = input('Volum [cl]: ');
   drikkeListe(N+1).('prosent')  = input('Prosent [%]: ');
   drikkeListe(N+1).('pris')     = input('Pris [kr]: ');   

   fprintf('\n')
   c                  = input('Ny flaske? [y/n] ','s');
   fprintf('\n')
   
if strcmpi(c,'ja')==1
    T = 0;
elseif strcmpi(c,'y')==1
    T = 0;
else
    T = 1;
end
N = N + 1;
end
save(filnavn,'Alkoliste.m'); 
Kjører jeg derimot skriptet får jeg opp følgende feilmelding

Error using load
Number of columns on line 2 of ASCII file C:\----\----\Alkoliste.m
must be the same as previous lines.

Error in Flaaske (line 3)
load 'Alkoliste.m';


Hva er det som er galt her?

Posted: 08/10-2012 08:38
by drgz
plutarco wrote:Vil det ikke være mye lettere og mer oversiktlig å bruke klassestruktur i Python eller Java (f.eks. superklasse Produkt og subklasser Øl, Whisky, Vin etc som arver fra Produkt)
Man kan gjøre dette i Matlab også, så vet ikke om det er noe særlig enklere i verken Python eller Java.

@Nebu:

Bytt til:

load('Alkoliste.mat'); og save('Alkoliste.mat','drikkeListe');

Posted: 08/10-2012 09:04
by Nebuchadnezzar
Prøvde du i det hele tatt kjøre scriptet/fila? Får fortsatt feilmelding

Error using load
Unable to read MAT-file C:\Users\---\Alkoliste.mat: not a
binary MAT-file.
Try LOAD -ASCII to read as text.

Error in Flaaske (line 3)
drikkeliste = load('Alkoliste.mat');

Posted: 08/10-2012 09:09
by drgz
Du får tenke litt på hva du gjør feil; det er ganske åpenbart..

Posted: 08/10-2012 09:19
by Nebuchadnezzar
Jeg fant det ut! Skulle akkuratt til å slette innlegget mitt..
Være oppe hele natten ikke lurt, lagret heller mat fila som en struct altså

Code: Select all

save('Alkoliste.mat', '-struct','drikkeListe') 
Da funket det =) Matlab begynner sakte å synke inn.