让我们从一个例子开始。在基础工作区中定义一维向量:
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)
最终我会,但我只是想知道是否有一些我不知道的东西,因为这可能是一个非常有用的功能。
答案 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);
在这种情况下,函数r
是closure,因为它捕获预定义的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);