2011-02-06 20 views
33

¿Hay alguna forma de declarar variables globales en MATLAB?Declarando una variable global en MATLAB

Por favor, no responder con:

global x y z; 

porque yo también puedo leer the help files.

he declarado una variable global, x, y luego hecho algo como esto:

function[x] = test() 
    global x; 
    test1(); 
end 

Cuando la función test1() se define como:

function test1() 
    x = 5; 
end 

Cuando corro test(), mi salida es x = []. ¿Hay alguna forma de que salga el x=5, o lo que sea que defina x para estar en una función separada? En C, esta sería una variable externa, y pensé que convertirla en una variable global debería lograr precisamente eso.

+5

+1 para poder leer los archivos de ayuda, al menos hasta que dice: 'Sin embargo, si varias funciones, y posiblemente el espacio de trabajo base, * todos * declaran un nombre particular como global, todos comparten una sola copia de esa variable. – Jonas

Respuesta

46

Debe declarar x como global variable en cada ámbito (es decir, función/espacio de trabajo) en el que desea que se comparta. Por lo tanto, es necesario escribir test1 como:

function test1() 
    global x; 
    x = 5; 
end 
+19

Esto es correcto. Sin embargo, la respuesta a la pregunta "¿Debería usar globales en el lenguaje X" casi siempre es "no hacer" – KitsuneYMG

+4

@KitsuneYMG: De acuerdo. Las variables globales no son bonitas y son un gran dolor para realizar un seguimiento, pero en casos raros puede ser un mal necesario. Si supiera más acerca de cuál era la situación específica del OP (creo que lo anterior es un ejemplo simplificado), probablemente podría sugerir un mejor enfoque. – gnovice

+0

quizás podrías ofrecerme algunos consejos entonces. Escribí un programa que está compuesto por un par de archivos '.m'. El programa toma una matriz A como entrada, luego la pasa a una función, esa función hace algo a la matriz, y la pasa a otra función que hace otra cosa con la matriz A. Finalmente, volvemos a la matriz original, comprueba la matriz de salida y luego la pasa a una última función para hacer algo con la matriz. Mi problema es que no creo que la función se haya pasado correctamente de las funciones, así que pensé que debía declararla globalmente. – Amit

4

Refiriéndose a su comentario hacia gnovice utilizando una variable global puede ser un enfoque para resolver el problema, pero no es un uso común.

En primer lugar asegúrese de que sus archivos están .mfunciones y no guiones. Las secuencias de comandos comparten un espacio de trabajo común, por lo que es fácil sobrescribir involuntariamente las variables. Por el contrario, las funciones tienen su propio alcance.

Utilice xUnit para generar una prueba de unidad repetible para sus funciones. Al probar cada función involucrada en su programa, rastreará la fuente del error. Al tener su prueba unitaria en su lugar, se pueden verificar más modificaciones de código.

+0

Gracias por su respuesta. Lo que dijiste es definitivamente correcto, +1. En lugar de usar vars globales, ahora uso el valor de retorno de la función y lo configuro como lo que quiera en la función principal. Funciona mucho mejor y es lo que estaba buscando inicialmente, aunque no sabía de una manera de lograr tales tareas. Funciona muy bien ahora, gracias! – Amit

1

Una posible forma de evitar el desorden global es asignar la variable como appdata. Puede usar las funciones setappdata y getappdata para asignar y recuperar appdata desde una ventana de MATLAB. Siempre que una sesión de MATLAB esté activa, existe una ventana indicada por 0.

>> setappdata(0,'x',10) % 0 indicates the root MATLAB window 

Ahora la variable x no es visible para cualquier script o función, pero se puede acceder siempre que sea necesario usando getappdata.

function test 
    globalX = getappdata(0,'x'); 
    disp(globalX); 
end 

x = 
    10 

La buena noticia es que se puede asignar cualquier objeto MATLAB válida para appdata, Sólo tenga cuidado con los nombres, el uso de nombres únicos para los campos appdata como ModelOptimizerOptions en lugar de un genérico x, y ayudaría. Esto también funciona en los ejecutables compilados y el código implementado en el servidor de producción MATLAB.

Cuestiones relacionadas