对于神经网络,我想y = [1;2;3]在矩阵中表示一个列向量,如下所示:
y = [1 0 0;
0 1 0;
0 0 1]
Run Code Online (Sandbox Code Playgroud)
我的矢量y非常大,因此硬编码不是一种选择.另外,我想避免使用for-loops.
到目前为止我做了什么:
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
Run Code Online (Sandbox Code Playgroud)
我也试过这个:
y1( y1 == [2;0;0] )=[0;1;0]; % This of course does not work
Run Code Online (Sandbox Code Playgroud)
有没有办法指定我想要比较列 y1 == [2;0;0],还是有另一种方法来解决这个问题?
从您的问题的上下文中,您希望找到一个矩阵,其中每列是一个标识向量.对于同一性向量,该矩阵中的每列是非零向量,其中1被设置在由每个位置表示的向量的位置,y否则为0.因此,假设我们有以下示例:
y = [1 5 4 3]
Run Code Online (Sandbox Code Playgroud)
你将拥有y_out最终矩阵,即:
y_out =
1 0 0 0
0 0 0 0
0 0 0 1
0 0 1 0
0 1 0 0
Run Code Online (Sandbox Code Playgroud)
有几种方法可以做到这一点.最简单的方法是声明单位矩阵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
Run Code Online (Sandbox Code Playgroud)
另一种方法是声明一个sparse矩阵,其中每个行索引只是那些来自的元素,y并且每个列索引从1增加到尽可能多的元素y:
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
Run Code Online (Sandbox Code Playgroud)
另一种方法是使用sub2ind在矩阵中查找线性索引,然后访问这些元素并将它们设置为1.因此:
ind = sub2ind([max(y) numel(y)], y, 1:numel(y));
y_out = zeros(max(y), numel(y));
y_out(ind) = 1
y_out =
1 0 0 0
0 0 0 0
0 0 0 1
0 0 1 0
0 1 0 0
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1120 次 |
| 最近记录: |