Array of arrays (Matlab)

Det er god trening å prate matematikk. Her er det fritt fram for alle. Obs: Ikke spør om hjelp til oppgaver i dette underforumet.

Moderatorer: Vektormannen, espen180, Aleks855, Solar Plexsus, Gustav, Nebuchadnezzar, Janhaa

Nebuchadnezzar
Fibonacci
Fibonacci
Innlegg: 5648
Registrert: 24/05-2009 14:16
Sted: NTNU

Har en lang rekke arrays som ser ut noenlunde som dette

Kode: Velg alt

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

Kode: Velg alt

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å ?
"Å vite hva man ikke vet er og en slags allvitenhet" - Piet Hein
https://s.ntnu.no/Integralkokeboken
Lektor - Matematikk, Fysikk og Informatikk
Emilga
Riemann
Riemann
Innlegg: 1552
Registrert: 20/12-2006 19:21
Sted: NTNU

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.
drgz
Fermat
Fermat
Innlegg: 757
Registrert: 24/12-2008 23:22

Hvis du kan bruke structs i stedet så er det ganske rett frem å hente ut data:

Kode: Velg alt

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

Kode: Velg alt

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

Kode: Velg alt

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.
Sist redigert av drgz den 04/10-2012 15:52, redigert 2 ganger totalt.
drgz
Fermat
Fermat
Innlegg: 757
Registrert: 24/12-2008 23:22

Emomilol skrev: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'
Nebuchadnezzar
Fibonacci
Fibonacci
Innlegg: 5648
Registrert: 24/05-2009 14:16
Sted: NTNU

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.

Kode: Velg alt

% 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.
"Å vite hva man ikke vet er og en slags allvitenhet" - Piet Hein
https://s.ntnu.no/Integralkokeboken
Lektor - Matematikk, Fysikk og Informatikk
Janhaa
Boltzmann
Boltzmann
Innlegg: 8552
Registrert: 21/08-2006 03:46
Sted: Grenland

blir "tørst" av denne tråden...
dr alk
La verken mennesker eller hendelser ta livsmotet fra deg.
Marie Curie, kjemiker og fysiker.

[tex]\large\dot \rho = -\frac{i}{\hbar}[H,\rho][/tex]
drgz
Fermat
Fermat
Innlegg: 757
Registrert: 24/12-2008 23:22

Nebuchadnezzar skrev:
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.

Kode: Velg alt

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***?
Nebuchadnezzar
Fibonacci
Fibonacci
Innlegg: 5648
Registrert: 24/05-2009 14:16
Sted: NTNU

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.
"Å vite hva man ikke vet er og en slags allvitenhet" - Piet Hein
https://s.ntnu.no/Integralkokeboken
Lektor - Matematikk, Fysikk og Informatikk
krje1980
Leibniz
Leibniz
Innlegg: 964
Registrert: 04/04-2009 20:55

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 :).
Gustav
Tyrann
Tyrann
Innlegg: 4558
Registrert: 12/12-2008 12:44

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)
Nebuchadnezzar
Fibonacci
Fibonacci
Innlegg: 5648
Registrert: 24/05-2009 14:16
Sted: NTNU

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

Kode: Velg alt

   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

Kode: Velg alt

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?
"Å vite hva man ikke vet er og en slags allvitenhet" - Piet Hein
https://s.ntnu.no/Integralkokeboken
Lektor - Matematikk, Fysikk og Informatikk
drgz
Fermat
Fermat
Innlegg: 757
Registrert: 24/12-2008 23:22

plutarco skrev: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');
Nebuchadnezzar
Fibonacci
Fibonacci
Innlegg: 5648
Registrert: 24/05-2009 14:16
Sted: NTNU

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');
"Å vite hva man ikke vet er og en slags allvitenhet" - Piet Hein
https://s.ntnu.no/Integralkokeboken
Lektor - Matematikk, Fysikk og Informatikk
drgz
Fermat
Fermat
Innlegg: 757
Registrert: 24/12-2008 23:22

Du får tenke litt på hva du gjør feil; det er ganske åpenbart..
Nebuchadnezzar
Fibonacci
Fibonacci
Innlegg: 5648
Registrert: 24/05-2009 14:16
Sted: NTNU

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å

Kode: Velg alt

save('Alkoliste.mat', '-struct','drikkeListe') 
Da funket det =) Matlab begynner sakte å synke inn.
"Å vite hva man ikke vet er og en slags allvitenhet" - Piet Hein
https://s.ntnu.no/Integralkokeboken
Lektor - Matematikk, Fysikk og Informatikk
Svar