在matlab中初始化具有特定值的矩阵

时间:2012-11-07 21:52:12

标签: matlab matrix initialization

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

我知道我可以使用循环来完成它。但是,有一种直接的简单方式,我的意思是一个班轮?

2 个答案:

答案 0 :(得分: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。

答案 1 :(得分:0)

一种方法是使用sub2indZ中的值转换为A中的绝对索引,然后使用向量索引:

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

或仅仅是单行:

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