有效地将向量解压缩为二进制矩阵 Octave
Efficiently unpack a vector into binary matrix Octave
在 Octave 上,我正在尝试以以下格式解压矢量:
y = [ 1
2
4
1
3 ]
我想要 return 一个维度矩阵 ( rows(y) x max value(y) ),其中对于每一行,我在原始数字值的列中有一个 1,还有一个零其他地方,即上面的例子
y01 = [ 1 0 0 0
0 1 0 0
0 0 0 1
1 0 0 0
0 0 1 0 ]
到目前为止我有
y01 = zeros( m, num_labels );
for i = 1:m
for j = 1:num_labels
y01(i,j) = (y(i) == j);
end
end
这可行,但对于更大的矩阵会变慢,而且看起来效率低下,因为它循环遍历每个值,即使大多数值没有改变。
我在 another thread 上为 R 找到了这个:
f3 <- function(vec) {
U <- sort(unique(vec))
M <- matrix(0, nrow = length(vec),
ncol = length(U),
dimnames = list(NULL, U))
M[cbind(seq_len(length(vec)), match(vec, U))] <- 1L
M
}
但我不知道 R 并且我不确定 if/how 解决方案移植到八度。
感谢任何建议!
使用稀疏矩阵(这也节省了大量内存),可以像往常一样用于进一步计算:
y = [1; 2; 4; 1; 3]
y01 = sparse (1:rows (y), y, 1)
如果你真的想要一个完整的矩阵,那么使用 "full":
full (y01)
ans =
1 0 0 0
0 1 0 0
0 0 0 1
1 0 0 0
0 0 1 0
当矩阵很大时,稀疏是一种更有效的方法。
如果你的结果维度不是很高,你可以试试这个:
y = [1; 2; 4; 1; 3]
I = eye(max(y));
y01 = I(y,:)
结果与 full(sparse(...)) 相同。
y01 =
1 0 0 0
0 1 0 0
0 0 0 1
1 0 0 0
0 0 1 0
另一种可能是:
y = [1; 2; 4; 1; 3]
classes = unique(y)(:)
num_labels = length(classes)
y01=[1:num_labels] == y
详细打印输出如下:
y =
1
2
4
1
3
classes =
1
2
3
4
num_labels = 4
y01 =
1 0 0 0
0 1 0 0
0 0 0 1
1 0 0 0
0 0 1 0
% Vector y to Matrix Y
Y = zeros(m, num_labels);
% Loop through each row
for i = 1:m
% Use the value of y as an index; set the value matching index to 1
Y(i,y(i)) = 1;
end
在 Octave 上,我正在尝试以以下格式解压矢量:
y = [ 1
2
4
1
3 ]
我想要 return 一个维度矩阵 ( rows(y) x max value(y) ),其中对于每一行,我在原始数字值的列中有一个 1,还有一个零其他地方,即上面的例子
y01 = [ 1 0 0 0
0 1 0 0
0 0 0 1
1 0 0 0
0 0 1 0 ]
到目前为止我有
y01 = zeros( m, num_labels );
for i = 1:m
for j = 1:num_labels
y01(i,j) = (y(i) == j);
end
end
这可行,但对于更大的矩阵会变慢,而且看起来效率低下,因为它循环遍历每个值,即使大多数值没有改变。
我在 another thread 上为 R 找到了这个:
f3 <- function(vec) {
U <- sort(unique(vec))
M <- matrix(0, nrow = length(vec),
ncol = length(U),
dimnames = list(NULL, U))
M[cbind(seq_len(length(vec)), match(vec, U))] <- 1L
M
}
但我不知道 R 并且我不确定 if/how 解决方案移植到八度。
感谢任何建议!
使用稀疏矩阵(这也节省了大量内存),可以像往常一样用于进一步计算:
y = [1; 2; 4; 1; 3]
y01 = sparse (1:rows (y), y, 1)
如果你真的想要一个完整的矩阵,那么使用 "full":
full (y01)
ans =
1 0 0 0
0 1 0 0
0 0 0 1
1 0 0 0
0 0 1 0
当矩阵很大时,稀疏是一种更有效的方法。 如果你的结果维度不是很高,你可以试试这个:
y = [1; 2; 4; 1; 3]
I = eye(max(y));
y01 = I(y,:)
结果与 full(sparse(...)) 相同。
y01 =
1 0 0 0
0 1 0 0
0 0 0 1
1 0 0 0
0 0 1 0
另一种可能是:
y = [1; 2; 4; 1; 3]
classes = unique(y)(:)
num_labels = length(classes)
y01=[1:num_labels] == y
详细打印输出如下:
y =
1
2
4
1
3
classes =
1
2
3
4
num_labels = 4
y01 =
1 0 0 0
0 1 0 0
0 0 0 1
1 0 0 0
0 0 1 0
% Vector y to Matrix Y
Y = zeros(m, num_labels);
% Loop through each row
for i = 1:m
% Use the value of y as an index; set the value matching index to 1
Y(i,y(i)) = 1;
end