在MATLAB中调用用户定义的函数

时间:2015-03-26 13:48:46

标签: matlab

我尝试在MATLAB中定义一个函数。然后我想在其他程序中使用此功能。代码如下:

function E = maxadd(n,m,A,B) 

n = input ('Enter the no. of rows of matrix A or B : '); 

m = input ('Enter the no. of columns of matrix A or B : '); 

A = input ('enter the matrix A, n*m : ');

B = input ('enter the matrix B, n*m : ');

D = -Inf(n,m);

for i=1:n     %addition of matrices

  for j=1:m

      D(i,j)=max (A(i,j), B(i,j));

  end;

end;

E = D ;

end

该程序运行正常但是,如果我在命令窗口中运行maxadd(2,2,[1 2;3 4],[0 4 ;3 7]),它会再次询问我输入而不是给我一个答案。

请帮我解决这个问题。我的文件名是maxadd.m

3 个答案:

答案 0 :(得分:1)

第一部分  你的代码

function E = maxadd(n,m,A,B)

n = input ('Enter the no. of rows of matrix A or B : ');

m = input ('Enter the no. of columns of matrix A or B : ');

A = input ('enter the matrix A, n*m : ');

B = input ('enter the matrix B, n*m : ');

您的代码有一个问题要么询问用户输入,要么自己传递值,以便您可以使用 函数E = maxadd(n,m,A,B)只是传递命令窗口中的值即可 不需要这部分

n = input ('Enter the no. of rows of matrix A or B : ');

    m = input ('Enter the no. of columns of matrix A or B : ');

    A = input ('enter the matrix A, n*m : ');

    B = input ('enter the matrix B, n*m : ');

答案 1 :(得分:0)

您已经将n,m,A和B作为maxadd函数的输入参数传递。你不应该在函数内部要求相同的值。如果要在函数内部调用输入,请执行与此类似的操作:

function E = maxadd() 

n = input ('Enter the no. of rows of matrix A or B : '); 

m = input ('Enter the no. of columns of matrix A or B : '); 

A = input ('enter the matrix A, n*m : ');

B = input ('enter the matrix B, n*m : ');

D = -Inf(n,m);

for i=1:n     %addition of matrices

  for j=1:m

      D(i,j)=max (A(i,j), B(i,j));

  end;

end;

E = D ;

end

当你打电话时:

>> maxadd
Enter the no. of rows of matrix A or B : 2
Enter the no. of columns of matrix A or B : 2
enter the matrix A, n*m : rand(2,2)
enter the matrix B, n*m : rand(2,2)

ans =

    0.8147    0.2785
    0.9058    0.9134

如果您不想更改对maxadd功能的所有调用,只需修改它:

function E = maxadd(n, m, A, B) 

D = -Inf(n,m);

for i=1:n     %addition of matrices

  for j=1:m

      D(i,j)=max (A(i,j), B(i,j));

  end;

end;

E = D ;

end

答案 2 :(得分:0)

你没有说清楚这一点,但我猜你正在尝试编写一个函数,该函数在询问用户的默认行为上采用可选参数。如果是这样,您需要在函数中显式写入逻辑,如下所示:

function E = maxadd(n,m,A,B) 

%//prompt user for values if they weren't passed as parameters
if nargin < 1
    n = input ('Enter the no. of rows of matrix A or B : '); 
end
if nargin < 2
    m = input ('Enter the no. of columns of matrix A or B : '); 
end
if nargin < 3
    A = input ('enter the matrix A, n*m : ');
end
if nargin < 4
    B = input ('enter the matrix B, n*m : ');
end

%//your logic here

end

这将检查调用者指定的输入参数的数量,并相应地请求丢失的参数。

但是,我们可以做得更好。


通常,当我们请求用户输入时,我们应该始终假设用户可以搞砸并给我们无意义的输入。因此,最好始终检查您的输入。

在你的情况下,前两个参数应该是数字,最后两个参数应该是矩阵,所以我们检查它们是这样的:

function E = maxadd(n,m,A,B) 

%//prompt user for values if they weren't passed as parameters
if nargin < 1
    n = input ('Enter the no. of rows of matrix A or B : '); 
end
if nargin < 2
    m = input ('Enter the no. of columns of matrix A or B : '); 
end
if nargin < 3
    A = input ('enter the matrix A, n*m : ');
end
if nargin < 4
    B = input ('enter the matrix B, n*m : ');
end

%//validate input
if ~isnumeric(n)
    error('Input parameter n must be numeric');
elseif ~isnumeric(m)
    error('Input parameter m must be numeric');
elseif ~ismatrix(A)
    error('Input parameter A must be a matrix');
elseif ~ismatrix(B)
    error('Input parameter B must be a matrix');
end


%//your logic here

end

但我们可以进一步改善这一点。请注意,nm实际上是矩阵AB的属性,请注意两个矩阵确实需要与算法相同的维度才能工作。结合这些知识,我们将代码最小化:

function E = maxadd(A,B) 

%//prompt user for values if they weren't passed as parameters
if nargin < 1
    A = input ('enter the matrix A, n*m : ');
end
if nargin < 2
    B = input ('enter the matrix B, n*m : ');
end

%//validate input
if ~ismatrix(A)
    error('Input parameter A must be a matrix');
elseif ~ismatrix(B)
    error('Input parameter B must be a matrix');
elseif ~isequal(size(A), size(B))
    error('Matrices A and B must have the same dimensions')
end

n = size(A, 1);
m = size(A, 2);

%//your logic here

end

最后,我想指出两件事:

  1. max已经完成了您尝试做的事情。调用max(A,B)将为您提供相同的输出
  2. E根本没有必要。如果您将输出变量更改为D并删除行E = D;,则代码也可以正常工作。