Matlab 'hjälp'

Elektronikrelaterade (på komponentnivå) frågor och funderingar.
jens8080
Inlägg: 20
Blev medlem: 2 december 2011, 22:48:21

Matlab 'hjälp'

Inlägg 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
hatten
Inlägg: 94
Blev medlem: 9 maj 2008, 22:16:23
Ort: Uppsala

Re: Matlab 'hjälp'

Inlägg av hatten »

Lätt fixat med str2num eller str2double!

Kod: Markera allt

s = query(gpibObject, 'READ?');
x = str2double(s);
jens8080
Inlägg: 20
Blev medlem: 2 december 2011, 22:48:21

Re: Matlab 'hjälp'

Inlägg 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.
snigelen
Inlägg: 815
Blev medlem: 8 maj 2009, 11:02:14
Ort: Lund

Re: Matlab 'hjälp'

Inlägg 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                
jens8080
Inlägg: 20
Blev medlem: 2 december 2011, 22:48:21

Re: Matlab 'hjälp'

Inlägg av jens8080 »

Tackar nu funkar det med str2num()
jens8080
Inlägg: 20
Blev medlem: 2 december 2011, 22:48:21

Re: Matlab 'hjälp'

Inlägg 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?
Neptunus
Inlägg: 41
Blev medlem: 3 september 2012, 08:54:59

Re: Matlab 'hjälp'

Inlägg 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.
snigelen
Inlägg: 815
Blev medlem: 8 maj 2009, 11:02:14
Ort: Lund

Re: Matlab 'hjälp'

Inlägg 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.
Användarvisningsbild
Mr. Pink
Inlägg: 109
Blev medlem: 18 april 2008, 14:49:44
Ort: Belmont, Kalifornien, USA

Re: Matlab 'hjälp'

Inlägg 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}
jens8080
Inlägg: 20
Blev medlem: 2 december 2011, 22:48:21

Re: Matlab 'hjälp'

Inlägg 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.
jens8080
Inlägg: 20
Blev medlem: 2 december 2011, 22:48:21

Re: Matlab 'hjälp'

Inlägg 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));
snigelen
Inlägg: 815
Blev medlem: 8 maj 2009, 11:02:14
Ort: Lund

Re: Matlab 'hjälp'

Inlägg 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.
Skriv svar