对于神经网络,我想在矩阵中表示列向量y = [1;2;3]
,如下所示:
y = [1 0 0;
0 1 0;
0 0 1]
我的矢量y
非常大,因此硬编码不是一种选择。另外,我想避免使用for
- 循环。
到目前为止我做了什么:
y1 =[y; zeros(1,length(y)) ;zeros(1,length(y))] % add two rows with zeros in orde to give y the right format
idx = find(y1(1,:) == 2); % find all the columns containing a 2
y1(:,idx(1):idx(end)) = y1(:,[0;1;0]); % this does not work because now I am comparing a matrix with a vector
我也试过这个:
y1( y1 == [2;0;0] )=[0;1;0]; % This of course does not work
有没有办法指定我想比较y1 == [2;0;0]
中的列,还是有其他方法可以解决这个问题?
答案 0 :(得分:7)
从您的问题的上下文中,您希望找到一个矩阵,其中每列是标识向量。对于同一性向量,该矩阵中的每列是非零向量,其中1被设置在由y
的每个位置表示的向量的位置,否则为0。因此,我们假设我们有以下示例:
y = [1 5 4 3]
您将y_out
作为最终矩阵,即:
y_out =
1 0 0 0
0 0 0 0
0 0 0 1
0 0 1 0
0 1 0 0
有几种方法可以做到这一点。最简单的方法是使用eye
声明单位矩阵,然后让y
从这个矩阵中选出你想要的那些列,并将它们作为列放入最终矩阵中。如果y
具有所有唯一值,那么我们只需根据y
重新排列此标识矩阵的列。就这样:
y_out = eye(max(y));
y_out = y_out(:,y)
y_out =
1 0 0 0
0 0 0 0
0 0 0 1
0 0 1 0
0 1 0 0
另一种方法是声明一个sparse
矩阵,其中每个行索引只是来自y
的那些元素,并且每个列索引从1增加到尽可能多的元素{{1 }}:
y
另一种方法是使用sub2ind
在矩阵中查找线性索引,然后访问这些元素并将它们设置为1.因此:
y_out = sparse(y, 1:numel(y), 1, max(y), numel(y));
y_out = full(y_out)
y_out =
1 0 0 0
0 0 0 0
0 0 0 1
0 0 1 0
0 1 0 0
答案 1 :(得分:2)
即使y
有“缺失”值,这也有效:
n = numel(y);
y_matrix = zeros(n, max(y));
y_matrix((1:n) + (y-1)*n) = 1;
示例:
y = [1 5 3 2];
给出
y_matrix =
1 0 0 0 0
0 0 0 0 1
0 0 1 0 0
0 1 0 0 0
答案 2 :(得分:2)
您可以使用bsxfun
:
y_out = bsxfun(@eq, (1:max(y)).', y);
答案 3 :(得分:1)
没有@ rayryeng的答案那么有效,但这也可能有所帮助,
此外,如果y
中有重复的值,则此代码可以正常工作。
a = [1 2 3 2 5 7 6 8];
[X,Y] = meshgrid(a,1 : length(a));
A = X == Y;
A =
1 0 0 0 0 0 0 0
0 1 0 1 0 0 0 0
0 0 1 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 1 0 0 0
0 0 0 0 0 0 1 0
0 0 0 0 0 1 0 0
0 0 0 0 0 0 0 1