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

Creating an array of matrix as an input of function in Matlab

我想创建几个矩阵来表示不同阶数的希尔伯特矩阵。然后矩阵将被函数调用。但是,出现错误消息,指出函数 (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) 

您正在尝试创建一个脚本文件,但您也在尝试在脚本文件中定义一个不允许的函数。创建脚本文件以从文件顶部到底部批量执行命令。它们的设计目的不是在其中定义函数,然后您 运行 脚本。


看来我错了。以上是我完全了解的 MATLAB,但 Octave 的行为不同。请参阅下面的 carandraug 的回答。您需要先定义函数,然后再定义代码,但它也需要在开头有一些东西。

但是,如果您是 MATLAB 开发人员,我会推荐如下所示。


因此,解决此问题的一种方法是将 GE 放在一个名为 GE.m 的单独文件中,并将其保存到同一工作目录中。接下来,在您正在处理的脚本文件中,删除 GE 的定义,然后再次尝试 运行ning 您的代码。它应该有效。

具体来说,在名为 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 的 post:In MATLAB, can I have a script and a function definition in the same file?

然而,另一方面,您可以在脚本文件中定义的唯一 "function" 是 anonymous 函数,但这可能不是您的目标。

您可以在 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

的解析开始