Hoa
Hoa

Reputation: 20438

How do I initialize variables and have them available in the console?

For example in testinit.m I have the following

function [x, y, m] = testinit

x=4
y=3
m=2

When I run testinit in the console it correctly displays the value. However when I type x it says

error: 'x' undefined...

Upvotes: 2

Views: 6707

Answers (5)

gnovice
gnovice

Reputation: 125864

The other answers are all possible solutions, but potentially more complicated than what you may be looking for. I think the first part of yuk's answer addresses the real problem you are having, but I think it deserves a more detailed explanation...

If you have a function that has output arguments, you need to actually capture those arguments in variables when you call the function. For example, if you typed this in the Command Window:

[x, y, m] = testinit;

Then you would have your three output values present for you to use. What you were probably doing was typing this:

testinit;

This would display the values (because you didn't end each line in the function with a semicolon to suppress displaying them), but it would not store them in variables in the Command Window for you to use later.

This is a result of how variables are stored in MATLAB, as described by the documentation on variable scope:

MATLAB stores variables in a part of memory called a workspace. The base workspace holds variables created during your interactive MATLAB session and also any variables created by running scripts. Variables created at the MATLAB command prompt can also be used by scripts without having to declare them as global.

Functions do not use the base workspace. Every function has its own function workspace. Each function workspace is kept separate from the base workspace and all other workspaces to protect the integrity of the data used by that function. Even subfunctions that are defined in the same file have a separate function workspace.

So, if you want to share variables between functions, the simplest way is to pass them back and forth via their input and output argument lists.

It should also be noted that the names you give variables in the output argument list of the function don't have to match the names of the variables you place those output values in. For example, given this function:

function [a, b, c] = testinit
  a = 4;
  b = 3;
  c = 2;

You can make this call in the Command Window:

[x, y, m] = testinit;

And you will get x = 4, y = 3, and m = 2.

Upvotes: 2

yuk
yuk

Reputation: 19870

If you run [x, y, m] = testinit in the console you should get the variables. The output variables can have any allowed name, not necessary x, y and m.

In addition you should put ; after each variable assignment in the function to avoid their output to the console. You can control the console output while calling the function.

If you want simply initialize new variables just by typing testinit, use assignin as in @BenVoigt's answer.

assignin('base','x',4)

However, this is dangerous, since some variable may already exist in the calling environment and will be overwritten. You can avoid it adding EXIST tests (inside EVALIN):

function testinit

if ~evalin('base','exist(''x'',''var'')')
    assignin('base','x',4)
end
if ~evalin('base','exist(''y'',''var'')')
    assignin('base','y',3)
end
if ~evalin('base','exist(''m'',''var'')')
    assignin('base','m',2)
end

You can also use 'caller' instead of 'base' if you plan to call the function from another function.

Upvotes: 2

Oli
Oli

Reputation: 16045

The variables are local to the function so you cannot access them from the command line. As @BenVoigt said, you can use asignin but it's very dirty, and I don't think that it's what you really want to do.

I advise you do go in debug mode

Add a break point or a keyboard to your function like that:

function [x, y, m] = testinit

x=4
y=3
m=2

keyboard

After execute your function, and the command line will remain in the environment of the function. The usual >> kill be replaced by a K>>. At that point you can access all your local variables.

To quit the debug mode type dbquit, or press shift+F5

Upvotes: 1

abdulhaq-e
abdulhaq-e

Reputation: 626

Just to add to the above answer, the reason you're getting this is because variables in a MatLab function are local variables, they are not passed to the workspace unless you use one of the functions in the above answer. You can read more about global and local variables here.

P.S If you wrote an m-file that is not a function, then the variables are global.

Upvotes: 4

Ben Voigt
Ben Voigt

Reputation: 283684

There's the assignin function (evalin is related). And also global.

Upvotes: 3

Related Questions