0

我有这个大小为 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等等

我知道我可以使用循环来做到这一点。但是有没有一种直接简单的方法,我的意思是一个班轮?

4

2 回答 2

3

总共有 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。

于 2012-11-07T22:21:05.200 回答
0

一种方法是在using中将值转换Z为绝对索引,然后使用向量索引:Asub2ind

idx = sub2ind(size(A), 1:numel(Z), Z);
A(idx) = 1;

或简单地说:

A(sub2ind(size(A), 1:numel(Z), Z)) = 1;
于 2012-11-07T22:07:04.223 回答