Sida 1 av 1

Matlab 'hjälp'

Postat: 24 oktober 2012, 14:41:34
av jens8080
Eftersom det verkar finnas mycket kunskap om det mesta på detta forum provar jag att fråga efter lite Matlab-support

Försöker göra en program i Matlab som styr ett mätinstrument (spektrumanalysator) via ett GPIB interface. Det funkar fint att styra instrumentet.
Använder mig av funktionen 'query' för att läsa ut mätdatat från instrumentet. Problemet är bara att matlab läser in all data som en textsträng och inte som numerisk dataarray eller en textarray.
Nån som vet hur man gör om datat sådet går att plotta

Re: Matlab 'hjälp'

Postat: 24 oktober 2012, 15:27:18
av hatten
Lätt fixat med str2num eller str2double!

Kod: Markera allt

s = query(gpibObject, 'READ?');
x = str2double(s);

Re: Matlab 'hjälp'

Postat: 24 oktober 2012, 16:19:01
av jens8080
Får inte funktionen 'str2double()' att fungera här. Matlab svarar 'NaN'

Textsträngen som returneras från instrumentet innehåller alltså många mätdata. Klipper jag ut en bit ser det ut så här:
'-99.24,-99.99,-73.03,-72.88,-99.99,-73.05',-70.03 osv

Datat är inte uppdelat i celler utan ligger som text i en cell.

Re: Matlab 'hjälp'

Postat: 24 oktober 2012, 16:34:22
av snigelen
Är sista fnutten felplacerad eller hur menar du annars? Ingår fnuttarna i strängen?

Provade du str2num?

Kod: Markera allt

>> s = '-99.24,-99.99,-73.03,-72.88,-99.99,-73.05'
s =
-99.24,-99.99,-73.03,-72.88,-99.99,-73.05
>> str2num(s)
ans =
  -99.2400  -99.9900  -73.0300  -72.8800  -99.9900  -73.0500
>> whos
  Name      Size            Bytes  Class     Attributes

  ans       1x6                48  double              
  s         1x41               82  char                

Re: Matlab 'hjälp'

Postat: 24 oktober 2012, 16:52:23
av jens8080
Tackar nu funkar det med str2num()

Re: Matlab 'hjälp'

Postat: 25 oktober 2012, 10:29:08
av jens8080
En ny fundering/problem.
Får en textsträng returnerad från instrumentet med diverse information jag skulle behöva använda, ser ut så här:

CTR WL 844.7,SPAN 50.0,RESOLN 1.0,REF LEV-20,AVR 1,LSCL 5.0,NORM

Skulle behöva använda mig av siffervärdena från denna sträng men hur gör man på enklaste sett?

Re: Matlab 'hjälp'

Postat: 25 oktober 2012, 11:04:20
av Neptunus
Googla på orden "matlab split string" så finner du lösningen på ditt problem. Alternativt plockar du fram manualen och läser om funktionen textscan.

Re: Matlab 'hjälp'

Postat: 25 oktober 2012, 11:18:38
av snigelen
Eller quick 'n' dirty, bara strunta i alla tecken som inte kan ingå i en vektor med tal. t.ex

Kod: Markera allt

>> s = 'CTR WL 844.7,SPAN 50.0,RESOLN 1.0,REF LEV-20,AVR 1,LSCL 5.0,NORM'
s =
CTR WL 844.7,SPAN 50.0,RESOLN 1.0,REF LEV-20,AVR 1,LSCL 5.0,NORM
>> str2num(s(s>='0' & s<='9' | s == ' ' | s == '.' | s == '-'))
ans =
  844.7000   50.0000    1.0000  -20.0000    1.0000    5.0000
Observera att du då får med -20 från LEV-20.

Re: Matlab 'hjälp'

Postat: 25 oktober 2012, 11:21:42
av Mr. Pink
Textscan kan också funka.

Kod: Markera allt

>> str=('CTR WL 844.7,SPAN 50.0,RESOLN 1.0,REF LEV-20,AVR 1,LSCL 5.0,NORM')

str =

CTR WL 844.7,SPAN 50.0,RESOLN 1.0,REF LEV-20,AVR 1,LSCL 5.0,NORM

>> textscan(str, '%s %s %f32 %s %d8 %s %d8 %s %s %d8 %s %d8 %s')

ans = 

  Columns 1 through 9

    {1x1 cell}    {1x1 cell}    [844.7000]    {1x1 cell}    [50]    {1x1 cell}    [1]    {1x1 cell}    {1x1 cell}

  Columns 10 through 13

    [1]    {1x1 cell}    [5]    {1x1 cell}

Re: Matlab 'hjälp'

Postat: 25 oktober 2012, 12:46:41
av jens8080
snigelen skrev:Eller quick 'n' dirty, bara strunta i alla tecken som inte kan ingå i en vektor med tal. t.ex

Kod: Markera allt

>> s = 'CTR WL 844.7,SPAN 50.0,RESOLN 1.0,REF LEV-20,AVR 1,LSCL 5.0,NORM'
s =
CTR WL 844.7,SPAN 50.0,RESOLN 1.0,REF LEV-20,AVR 1,LSCL 5.0,NORM
>> str2num(s(s>='0' & s<='9' | s == ' ' | s == '.' | s == '-'))
ans =
  844.7000   50.0000    1.0000  -20.0000    1.0000    5.0000
Observera att du då får med -20 från LEV-20.

Tack, det var en enkel o bra lösning.

Re: Matlab 'hjälp'

Postat: 1 november 2012, 11:13:32
av jens8080
Ett nytt huvudbry har dykt upp.

Använder mig av "UIGETFILE" för att öppna till ex. en textfil och "load" för att hämta filen vilket funkar bra.

Ex.
[FILENAME, PATHNAME, FILTERINDEX] = UIGETFILE('*.*', 'Load file');
load (fullfile(PATHNAME,FILENAME));

Problemet är bara att nät jag ska använda mig av filen i "FILENAME" så har den en filändelse se nedan.
Ex.
FILENAME=data1.txt

Fråga hur gör jag på ett 'snyggt' och enkelt sätt för att ta bort filändelsen så jag kan använda datat i "data1.txt"
gjorde en fullösning med att döpa om filen enl. nedan men det borde finnas nått bättre sätt.
Ex.
filnamn=load (fullfile(PATHNAME,FILENAME));

Re: Matlab 'hjälp'

Postat: 1 november 2012, 17:53:00
av snigelen
T.ex.

Kod: Markera allt

>> s = 'filename.txt'         
s =
filename.txt
>> s(find(s=='.'):end)=[]     
s =
filename
men det funkar inte om det finns mer än en punkt.

Kod: Markera allt

>> s = 'filename.txt'
s =
filename.txt
>> s(min(find(s=='.')):end)=[]
s =
filename
tar bort allt från första punkten till slutet (med max blir det från sista punkten). Finns det ingen punkt så händer inget med s.