我有一个大小为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 等等
我知道我可以使用循环来完成它。但是,有一种直接的简单方式,我的意思是一个班轮?
答案 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)
一种方法是使用sub2ind
将Z
中的值转换为A
中的绝对索引,然后使用向量索引:
idx = sub2ind(size(A), 1:numel(Z), Z);
A(idx) = 1;
或仅仅是单行:
A(sub2ind(size(A), 1:numel(Z), Z)) = 1;