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