我有一个向量idx = [3; 5; 3; 4; 3; 2; 5; 1]。数字从1:k开始,k = 5.我想用m"做一个" k矩阵A(m是向量idx中的元素数)。 A的每一行都包含' 0' 0' 0或者' 1'用' 1'由向量idx的索引表示。例如,A(k = 3)的第三行是" 1"在第1,3,5列,因为那些是" 3"在idx中。所以A =
[0 0 0 0 0 0 0 1; 0 0 0 0 1 0 0 0; 1 0 1 0 1 0 0 0; 0 0 0 1 0 0 0 0; 0 1 0 0 0 0 1 0]
我如何在Octave中执行此操作?谢谢!
答案 0 :(得分:1)
或另一种方式:
idx = [3; 5; 3; 4; 3; 2; 5; 1];
A = sparse (idx, [1:numel(idx)], 1)
A = Compressed Column Sparse (rows = 5, cols = 8, nnz = 8 [20%])
(3, 1) -> 1
(5, 2) -> 1
(3, 3) -> 1
(4, 4) -> 1
(3, 5) -> 1
(2, 6) -> 1
(5, 7) -> 1
(1, 8) -> 1
它为您提供了一个压缩列稀疏(非常高效),您可以将其转换为"正常,完整矩阵":
B = full (A)
B =
0 0 0 0 0 0 0 1
0 0 0 0 0 1 0 0
1 0 1 0 1 0 0 0
0 0 0 1 0 0 0 0
0 1 0 0 0 0 1 0
答案 1 :(得分:0)
试试这个:
idx = [3; 5; 3; 4; 3; 2; 5; 1];
n = numel(idx);
k = 5;
A=zeros(k,n);
A(sub2ind(size(A), idx, [1:n]')) = 1
输出是:
A =
0 0 0 0 0 0 0 1
0 0 0 0 0 1 0 0
1 0 1 0 1 0 0 0
0 0 0 1 0 0 0 0
0 1 0 0 0 0 1 0