Matlab - 在函数内使用未定义的函数/值

时间:2015-05-11 22:56:11

标签: matlab function

让我们从一个例子开始。在基础工作区中定义一维向量:

q = [1 0 2 4 2 3 4 2 1 0 2]; % Defined 1-D vector, already in Workspace.

这是一个M档案:

function vector = r(i)
vect(i) = q(3*i-2:3*i-1);

如果调用该函数,例如,

r(2);

Matlab抛出错误:“未定义的函数或方法'q'用于'double'类型的输入参数。”

我的问题是:有没有办法让Matlab将向量q“视为理所当然”在调用函数r时已经定义了q,因此技术上它可以从使用它的基础工作区。

当然,显而易见的解决方案是将q添加到参数列表中:

function vector = r(i,q)
...

然后用

调用它
r(2,q)

最终我会,但我只是想知道是否有一些我不知道的东西,因为这可能是一个非常有用的功能。

2 个答案:

答案 0 :(得分:3)

可以使用全局变量,但是you shouldn't。他们也inefficient

如果由于某种原因,不想仅仅将q作为第二个参数传递,那么这里有两个更好的选择。


1。通过匿名函数关闭

如果您的功能很简单并且可以在一行上书写,则可以在定义q向量后创建anonymous function

q = [1 0 2 4 2 3 4 2 1 0 2];
r = @(i)q(3*i-2:3*i-1);

在这种情况下,函数rclosure,因为它捕获预定义的q(请注意,r在这种情况下与您的out = r(2) 略有不同题)。您现在可以通过以下方式调用此方法:

function mainFun
    q = [1 0 2 4 2 3 4 2 1 0 2];
    r(i);

    function vect = r(i)
        vect(i) = q(3*i-2:3*i-1);
    end
end


2。通过子功能共享变量

更通用的选项是在主M-file函数中使用sub-function

q

向量mainFun在外部r和子函数q之间共享。 Matlab编辑器应该通过不同地着色copy: { nightlyBuild: { files: [{ expand: true, cwd: '../', src: ['index.html'], dest: '<%= dest %>', }] } }, grunt.task.registerTask('copyTo', 'copy into a specific destination', function(dest) { if (arguments.length === 0) { grunt.log.writeln(this.name + ", missing destination"); } else { grunt.log.writeln(this.name + " to " + dest); grunt.config.set('dest', dest); grunt.task.run([ 'copy:nightlyBuild' ]); } }); 来向您明确说明。更多细节和示例here

答案 1 :(得分:0)

您可以使用global变量MATLAB:

1)在工作区中,将q声明为全局,而不是设置其值

global q;
q = [1 0 2 4 2 3 4 2 1 0 2];

2)在你的函数中,将q声明为全局并使用它:

function vector = r(i)
global q;
vect(i) = q(3*i-2:3*i-1);