0

我有一个向量 idx = [3; 5个;3;4;3;2;5个;1]。该数字来自 1:k,k = 5。我想制作一个“k by m”矩阵 A(m 是向量 idx 中的元素数)。A 的每一行包含“0”或“1”,其中“1”由向量 idx 的索引指示。例如,A (k = 3) 的第三行在第 1、3、5 列是“1”,因为这些是 idx 中“3”的索引。所以 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 中做到这一点?谢谢!

4

2 回答 2

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
于 2015-03-30T06:20:19.197 回答
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
于 2015-03-29T03:08:20.780 回答