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

njh*_*jho 7 matlab octave

从Coursera机器学习开始分配任务.我很好奇这是如何工作的...从一个例子来看,这个更简单的代码:

% K is the number of classes.
K = num_labels;
Y = eye(K)(y, :);
Run Code Online (Sandbox Code Playgroud)

似乎是以下的替代品:

I = eye(num_labels);
Y = zeros(m, num_labels);
for i=1:m
  Y(i, :)= I(y(i), :);
end
Run Code Online (Sandbox Code Playgroud)

而且我不知道怎么做.我也有一些困难谷歌搜索这个信息.

谢谢!

gno*_*ice 7

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

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

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

>> 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
Run Code Online (Sandbox Code Playgroud)

注意: Octave允许您索引函数返回参数,而无需先将它们放在变量中,但MATLAB不会(至少不是很容易).因此,语法:

Y = eye(num_labels)(y, :);
Run Code Online (Sandbox Code Playgroud)

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