2010-02-05 7 views
11

Sto provando a scrivere una semplice funzione che prende due input, x e , e li passa a tre altre semplici funzioni che aggiungono, moltiplicano e dividono. La funzione principale dovrebbe quindi visualizzare i risultati come una stringa contenente x, e i totali.Come si inseriscono valori variabili in una stringa di testo in MATLAB?

Penso che ci sia qualcosa che non sto capendo sugli argomenti di output. Comunque, ecco il mio codice (pietoso):

function a=addxy(x,y) 
a=x+y; 

function b=mxy(x,y) 
b=x*y; 

function c=dxy(x,y) 
c=x/y; 

La funzione principale è:

function [d e f]=answer(x,y) 
d=addxy(x,y); 
e=mxy(x,y); 
f=dxy(x,y); 
z=[d e f] 

Come faccio ad avere i valori per x, y, d, e, e f in una stringa? Ho provato diverse matrici e roba del tipo:

['the sum of' x 'and' y 'is' d] 

ma nessuna delle variabili è visibile.

due ulteriori problemi:

  • Perché la funzione che restituisce "ans 3", anche se non ho chiesto per la durata del z?
  • Se qualcuno potesse raccomandare un buon libro per principianti allo scripting MATLAB, lo apprezzerei molto.
+0

uso sprintf: str = 'DEF'; var = sprint ('abc% SGHI', str); => abcDEFghi – KillBill

risposta

4

Come Peter e Amro illustrare, è necessario convertire i valori numerici in stringhe formattate in primo luogo per visualizzarli o concatenare con altre stringhe di caratteri. È possibile farlo utilizzando le funzioni FPRINTF, SPRINTF, NUM2STR e INT2STR.


Per quanto riguarda ottenere ans = 3 come uscita, probabilmente è perché non sta assegnando l'output di answer ad una variabile.Se si desidera ottenere tutti i valori di output, si dovrà chiamare answer nel seguente modo:

[out1,out2,out3] = answer(1,2); 

Questo metterà il valore d nel out1, il valore e in out2, e il valore f in out3 . Quando si esegue il seguente:

answer(1,2) 

MATLAB assegnerà automaticamente la prima uscita d (che ha il valore 3 in questo caso) per l'area di lavoro di default variabili ans.


Rispetto a suggerire una buona risorsa per l'apprendimento MATLAB, non si deve sottovalutare il valore della documentazione MATLAB. Ho imparato la maggior parte di quello che so da solo usandolo. È possibile accedervi dal numero online o dalla propria copia di MATLAB utilizzando le funzioni DOC, HELP o HELPWIN.

+0

Grazie, questo è molto utile. Ancora una breve domanda: se creo una variabile di output in una funzione, ad esempio: function a = simple (x); a = x^2; Come posso accedere al valore di 'a' da altre funzioni?Ad esempio: function b = simple2 (x); b = a * x; % chiamando da a 'semplice' – jefflovejapan

+1

@jefflovejapan: In tal caso, la tua seconda funzione sarebbe 'function b = simple2 (x) b = simple (x) * x;'. In altre parole, si chiamerebbe 'simple' in' simple2' e il suo output verrà utilizzato nell'equazione per 'b'. – gnovice

12

Ecco come convertire i numeri in stringhe, e unire le stringhe ad altre cose (è strano):

>> ['the number is ' num2str(15) '.'] 
ans = 
the number is 15. 
+0

Grazie mille. – jefflovejapan

+0

Questo è stato utile, ma non funziona ancora nel modo in cui lo desidero. Quando eseguo la funzione su (1,2) ottengo ans = 3, il che significa che le altre due funzioni, mxy e dxy, non vedono i valori di x e y. Inoltre, i valori per tutti gli argomenti di output sono vuoti. Penso che ci sia qualcosa di veramente semplice che non sto facendo qui con le variabili, ma non riesco a capire di cosa si tratta. – jefflovejapan

6

È possibile utilizzare fprintf/sprintf con la sintassi C familiare. Forse qualcosa di simile:

fprintf('x = %d, y = %d \n x+y=%d \n x*y=%d \n x/y=%f\n', x,y,d,e,f) 

leggere il tuo commento, questo è il modo di utilizzare le funzioni del programma principale:

x = 2; 
y = 2; 
[d e f] = answer(x,y); 
fprintf('%d + %d = %d\n', x,y,d) 
fprintf('%d * %d = %d\n', x,y,e) 
fprintf('%d/%d = %f\n', x,y,f) 

Anche per la risposta function(), è possibile assegnare i valori di uscita ad un vettore invece di tre variabili distinte:

function result=answer(x,y) 
result(1)=addxy(x,y); 
result(2)=mxy(x,y); 
result(3)=dxy(x,y); 

e chiamare semplicemente come:

out = answer(x,y); 
+0

grazie, questo è sicuramente più semplice, ma l'esercizio richiede specificamente di costruire funzioni e di farle passare le variabili avanti e indietro. – jefflovejapan

+0

Questo è fantastico, grazie mille. È bello che non sia necessario specificare in anticipo la dimensione del "risultato". – jefflovejapan

2

Ho appena capito perché stavo avendo così tanti problemi - in MATLAB non è possibile memorizzare stringhe di lunghezze diverse come una matrice utilizzando parentesi quadre. L'utilizzo di parentesi quadre consente di concatenare stringhe di lunghezze diverse in un unico carattere.

>> a=['matlab','is','fun'] 

a = 

matlabisfun 

>> size(a) 

ans = 

    1 11 

In un array di caratteri, ogni carattere in un conta stringa come un elemento, che spiega perché la dimensione di un è 1x11.

Per memorizzare stringhe di lunghezze variabili come elementi di una matrice, è necessario utilizzare le parentesi graffe per salvare come matrice di celle. Negli array di celle, ogni stringa viene trattata come un elemento separato, indipendentemente dalla lunghezza.

>> a={'matlab','is','fun'} 

a = 

    'matlab' 'is' 'fun' 

>> size(a) 

ans = 

    1  3 
0

Stavo cercando qualcosa lungo quello che volevi, ma volevo rimetterlo in una variabile.

Quindi questo è quello che ho fatto

variable = ['hello this is x' x ', this is now y' y ', finally this is d:' d]

fondamentalmente

variable = [str1 str2 str3 str4 str5 str6]

Problemi correlati