Y = eye(K)(y,:);替换" for"环? Coursera

时间:2017-05-25 03:46:42

标签: matlab octave

从Coursera机器学习中完成作业。我很好奇这是如何工作的...从一个例子来看,这个更简单的代码:

% K is the number of classes.
K = num_labels;
Y = eye(K)(y, :);

似乎可以替代以下内容:

I = eye(num_labels);
Y = zeros(m, num_labels);
for i=1:m
  Y(i, :)= I(y(i), :);
end

我不知道怎么做。我也很难用谷歌搜索这些信息。

谢谢!

2 个答案:

答案 0 :(得分:5)

在这种情况下,您的变量y必须是m - 元素向量,其中包含1到num_labels范围内的整数。代码的目标是创建一个Y矩阵m - by - num_labels,其中每行k将包含全部零,除了{{1}列{ 1}}。

生成y(k)的方法是首先使用函数eye创建一个单位矩阵。这是除了主对角线以外的所有零的方阵。因此,单位矩阵的行Y将在列k中具有一个非零元素。因此,我们可以使用k作为行索引,从标识矩阵索引的行中构建矩阵Y。我们可以使用for循环(如在第二个代码示例中)执行此操作,但这并不像使用单个索引操作那样简单有效(如在第一个代码示例中)。

让我们看一个例子(在MATLAB中):

y

注意: Octave允许您索引函数返回参数,而无需先将它们放在变量中,但MATLAB不会(at least, not very easily)。因此,语法:

>> num_labels = 5;
>> y = [2 3 3 1 5 4 4 4];  % The columns where the ones will be for each row
>> I = eye(num_labels)

I =

     1     0     0     0     0
     0     1     0     0     0
     0     0     1     0     0
     0     0     0     1     0
     0     0     0     0     1

>> Y = I(y, :)

Y =
                                       % 1 in column ...
     0     1     0     0     0         %    2
     0     0     1     0     0         %    3
     0     0     1     0     0         %    3
     1     0     0     0     0         %    1
     0     0     0     0     1         %    5
     0     0     0     1     0         %    4
     0     0     0     1     0         %    4
     0     0     0     1     0         %    4

仅适用于Octave。在MATLAB中,您必须按照上面的示例执行此操作,或使用其他选项之一here

答案 1 :(得分:2)

第一组代码是Octave,它具有一些MATLAB没有的附加索引功能。第二组代码是如何在MATLAB中执行操作。

在这两种情况下,Y是通过重新排列单位矩阵的行而生成的矩阵。在这两种情况下,对于合适的线性变换矩阵Y = T*y计算T也是可能的。

(上面假设y是一个整数向量,用作行的索引变量。如果不是这样,则代码很可能会抛出错误。)