我有这个大小为 100x100 的矩阵 A。现在我有另一个向量 Z=(1,24,5,80...) 它有 100 个元素。它是一个包含 100 个元素的列向量。现在对于矩阵 A 的每一行,我希望它的 A(i,j) 元素为 1,其中 i 是 1:100 的行,j 是 Z 给出的列
所以应该是1的元素应该是1,1 2,24 3,5 4,80等等
我知道我可以使用循环来做到这一点。但是有没有一种直接简单的方法,我的意思是一个班轮?
我有这个大小为 100x100 的矩阵 A。现在我有另一个向量 Z=(1,24,5,80...) 它有 100 个元素。它是一个包含 100 个元素的列向量。现在对于矩阵 A 的每一行,我希望它的 A(i,j) 元素为 1,其中 i 是 1:100 的行,j 是 Z 给出的列
所以应该是1的元素应该是1,1 2,24 3,5 4,80等等
我知道我可以使用循环来做到这一点。但是有没有一种直接简单的方法,我的意思是一个班轮?
总共有 10000 个非零元素(因此只有 1% 非零)的矩阵最好存储为稀疏矩阵。使用matlab的能力。
A = sparse(1:100,Z,1,100,100);
这是一个很好的、干净的单线性,它产生的矩阵将比完整矩阵更有效地存储。它仍然可以用于矩阵乘法,而且效率也会更高。例如...
Z = randperm(100);
A = sparse(1:100,Z,1,100,100);
whos A
Name Size Bytes Class Attributes
A 100x100 2408 double sparse
这几乎是 40 到 1 的内存减少。而且,虽然矩阵实际上相当小,但将其用作稀疏矩阵仍然更快。
B = rand(100);
timeit(@() B*A)
ans =
4.5717e-05
Af = full(A);
timeit(@() B*Af)
ans =
7.4452e-05
如果 A 为 1000x1000,则节省的费用会更加显着。
如果您的目标是完整矩阵,则可以使用 full 将其转换为完整矩阵,或者 accumarray 是一个选项。如果要将值插入现有数组,请使用 sub2ind。
一种方法是在using中将值转换Z
为绝对索引,然后使用向量索引:A
sub2ind
idx = sub2ind(size(A), 1:numel(Z), Z);
A(idx) = 1;
或简单地说:
A(sub2ind(size(A), 1:numel(Z), Z)) = 1;