我想创建几个矩阵来表示不同阶数的Hilbert矩阵。然后由函数调用矩阵。但是,出现错误消息,表示未定义函数(GE)。但是,如果我将函数放在for循环的顶部,则会出现另一条类似的消息,说明输入参数(A)未定义。我可以知道如何解决这个问题吗?
for k=2:12
H{k}=hilb(k);
x0(1:k)=1;%(1....1)
x0=x0(1:k);
b= H{k} .* x0'; %generate the n-vector b=Hx0
x_approx= GE(H{k},b);
endfor
function x_approx = GE(A,b)
答案 0 :(得分:2)
您正在尝试创建脚本文件,但您也尝试在脚本文件中定义一个不允许的函数。创建脚本文件以批量执行从文件顶部到底部的命令。它们不是设计为在其中定义函数,然后运行脚本。
看起来我错了。以上是针对MATLAB的,我很清楚,但Octave的行为是不同的。请参阅下面的carandraug的答案。您需要首先定义函数,然后是代码,但它也需要在开头有一些东西。
但是,如果您是MATLAB开发人员,我建议的内容如下所示。
因此,解决此问题的一种方法是将GE
放在名为GE.m
的单独文件中,并将其保存到同一个工作目录中。接下来,在您正在处理的脚本文件中,删除GE
的定义,然后再次尝试运行您的代码。它应该工作。
具体而言,在名为GE.m
的文件中,将GE
代码放在那里:
%// GE.m definition
function x_approx = GE(A,b)
...
...
endfunction
现在,在您正在处理的脚本文件中,将其他代码放在那里:
%// Script file stuff
for k=2:12
H{k}=hilb(k);
x0(1:k)=1;%(1....1)
x0=x0(1:k);
b= H{k} .* x0'; %generate the n-vector b=Hx0
x_approx= GE(H{k},b);
endfor
现在,如果您运行脚本文件,它应该可以正常工作。
如果要将所有内容保存在一个文件中,请将整个文件包装在function
声明中,让它在没有输入参数的情况下执行,输出参数与要保存在工作区中的任何内容一样,如此:
function x_val = test_GE
%// Script file stuff
for k=2:12
H{k}=hilb(k);
x0(1:k)=1;%(1....1)
x0=x0(1:k);
b= H{k} .* x0'; %generate the n-vector b=Hx0
x_val= GE(H{k},b);
endfor
endfunction
%// GE.m definition
function x_approx = GE(A,b)
...
...
endfunction
请注意,我已使用x_approx
更改了脚本定义中的变量x_val
,以避免与GE
给出的输出冲突。另外,我写的只会保存12 x 12
的希尔伯特矩阵的解。如果要保存所有这些,请考虑将结果放在单元格数组中,如下所示:
function x_val = test_GE
%// Script file stuff
x_val = cell(11,1); %// Change
for k=2:12
H{k}=hilb(k);
x0(1:k)=1;%(1....1)
x0=x0(1:k);
b= H{k} .* x0'; %generate the n-vector b=Hx0
x_val{k-1}= GE(H{k},b); %// Change
endfor
endfunction
%// GE.m definition
function x_approx = GE(A,b)
...
...
endfunction
现在你已经完成了,运行你的脚本文件应该可行。请记住,您永远不能将脚本文件和函数文件的行为混合在一起。它必须是一个或另一个。有关详情,请参阅gnovice发布的这篇文章:In MATLAB, can I have a script and a function definition in the same file?
但是,另一方面,您可以在脚本文件中定义的唯一“功能”是匿名功能,但这可能不是您的目标。
答案 1 :(得分:0)
您可以在Octave中定义函数,这不是问题。问题是在使用它之前需要定义函数。
#!/usr/bin/octave -qf
1;
function x_approx = GE(A,b)
## code for
endfunction
for k=2:12
H{k}=hilb(k);
x0(1:k)=1;%(1....1)
x0=x0(1:k);
b= H{k} .* x0'; %generate the n-vector b=Hx0
x_approx= GE(H{k},b);
endfor
另一件事是在脚本文件中,第一个语句不能是函数定义。如果要从函数开始,标准是使用1;
。但是,在大多数情况下,您实际上将从pkg load something;
开始或解析argv