为什么不进行矩阵赋值,例如; p(1)= 1,在Octave中的工作方式与其他编程语言一样吗?

时间:2016-10-09 06:26:10

标签: matlab octave

以下是示例。

这不起作用---

m = size(X, 1); % Number of training examples
p = zeros(m, 1);
p = sigmoid(X * theta);   % sigmoid returns a mx1 dimensional vector
for i = 1:m
    if ( p(i) >= 0.5)
        p(i) = 1;         % overwrite whatever value in p(i)
    endif
end

以下作品---

m = size(X, 1); % Number of training examples
p = zeros(m, 1);
sig = sigmoid(X * theta);
for i = 1:m
    if ( sig(i) >= 0.5)
        p(i) = 1;
    endif
end

第一个例子给出了浮点数而不是1或0。 目标是为满足条件的每个条目在m行中存储1个'p'。通过编程逻辑,第一个和第二个应该给出相同的结果,因为我只是覆盖满足if条件的条目,对吧?我错过了什么吗?

1 个答案:

答案 0 :(得分:0)

您的第一个示例执行以下操作:"在X上调用sigmoid并替换所有值> 0.5与1"

m = size(X, 1);
p = zeros(m, 1);
## Here you overwrite your entire p vector do the line above has no effect
p = sigmoid(X * theta);
for i = 1:m
  if ( p(i) >= 0.5)
    p(i) = 1;         % overwrite whatever value in p(i)
  endif
end

更简单的矢量化方式是:

p = sigmoid(X * theta);
p(p>0.5) = 1;

你的第二个例子用零初始化p并且如果sigmoid返回>则将元素设置为1。 0.5。哪个会被矢量化(是的,真的只有一行......)

p = sigmoid(X * theta) >= 0.5;

我希望你现在看到你的逻辑问题