【问题标题】:Octave error: no default value for argument 1 while calling function八度错误:调用函数时参数 1 没有默认值
【发布时间】:2015-02-02 00:24:39
【问题描述】:

我需要按列查找每个值的normalized 值。 所以我有这样的功能:

function [X_norm, mu, sigma] = featureNormalize(X)

X_norm = X;
mu = zeros(1, size(X, 2));
sigma = zeros(1, size(X, 2));

for x = 1:size(X, 1)
    mu(1,x) = mean(:, x)
    sigma(1,x) = std(:, x)
    for y = 1:size(X, 2)  
        X_norm(x,y) = (X(x,y) - mu)/sigma
    end  
end    

end

我正在尝试以这种方式调用此函数:

>> X = [23 32 2 ; 23 23 1];
>> featureNormalize(X)

结果我得到这样的错误:调用函数时参数 1 没有默认值。我不知道这里有什么问题,有什么建议吗?

【问题讨论】:

  • 我刚刚编辑了我的答案,请查看。编辑对我来说对结果更有意义..
  • 一件事还没有人解决,我认为这很重要,那就是错误消息的含义。在 Octave 中,您可以使用 : 来使用 default value,即 mean(:) 使用其默认值调用 Octave,在 mean 的情况下不存在。

标签: matlab octave


【解决方案1】:

我认为您使用 mean()std() 函数的方式存在问题,并且可能下标赋值也是一个问题。

我不确定,但请尝试以下代码作为您的函数定义:

1.基于行的归一化:

function [X_norm, mu, sigma] = featureNormalize(X)

X_norm = zeros(size(X));
mu     = zeros(1, size(X, 1));
sigma  = zeros(1, size(X, 1));

for x = 1:size(X, 1)
    mu(x)    = mean( X(x, :) );
    sigma(x) = std( X(x, :) );

    for y = 1 : size(X, 2)  
        X_norm(x, y) = ( X(x, y) - mu(x) ) / sigma(x);
    end  
end     
end

2。基于列的标准化:

function [X_norm, mu, sigma] = featureNormalize(X)

X_norm = zeros(size(X));
mu     = zeros(1, size(X, 2));
sigma  = zeros(1, size(X, 2));

for y = 1:size(X, 2)
    mu(y)    = mean( X(:, y) );
    sigma(y) = std( X(:, y) );

    for x = 1 : size(X, 1)  
        X_norm(x, y) = ( X(x, y) - mu(y) ) / sigma(y);
    end  
end     
end

【讨论】:

  • 你答对了,但我混淆了行和列)
  • @Rocketq - 我们对“按列的每个值的标准化值”感到困惑。你想如何标准化矩阵,我的意思是根据什么?取每一行或每一列的“平均值”和“标准”来做出决定。您能否澄清这一点?
  • 按列计算,但不用担心 Divakar 的解决方案很好
  • 感谢您的更改,现在未来的读者不会那么困惑了! :)
  • @Divakar - 没错!这有点混乱。我不确定未来的读者,因为问题主题似乎有点个人。没关系。谢谢((:
【解决方案2】:

如果您要针对每个 meansigma 值计算每个元素的标准化值,我认为您需要进行一些更改,因为您的问题代码没有确实反映了这一点,因为您使用的是 meansigma 值的数组。所以,我认为你需要做这样的事情 -

%// Initialize array for final normalized values
X_norm = zeros(size(X));
for x = 1:size(X, 2)

    %// Store mean and standard deviation values for each column
    mu = mean(X(:, x))
    sigma = std(X(:, x))

    %// Use an innermost loop to calculate the normalized values 
    %// for all the elements in each column. 
    %// Thus, for all these elements, you need to use the same mean
    %// and standard deviation calculated in the previous step
    for y = 1:size(X, 1)  
        X_norm(y,x) = (X(y,x) - mu)/sigma
    end  
end  

您可以使用 bsxfun 轻松矢量化上述代码 -

X_norm = bsxfun(@rdivide, bsxfun(@minus, X, mean(X,1)),std(X,[],1))

【讨论】:

  • 你的解决方案绝对正确,我混淆了行和列,非常感谢)
  • @Rocketq 我认为这和mehmet's solution 会给出不同的结果。鉴于问题的文本,对我来说这更有意义,所以我这样说。确定你到底在追求什么。要检查使用类似X = rand(5,4).
猜你喜欢
  • 2020-01-14
  • 2023-03-20
  • 2019-07-03
  • 1970-01-01
  • 1970-01-01
  • 2016-06-08
  • 2017-12-09
相关资源
最近更新 更多