在Matlab中创建一个矩阵数组作为函数的输入

时间:2015-03-11 13:44:08

标签: arrays matlab function matrix octave

我想创建几个矩阵来表示不同阶数的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) 

2 个答案:

答案 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