在matlab中用一定值初始化矩阵

在matlab中用一定值初始化矩阵,matlab,matrix,initialization,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 等等 我知道我可以用循环来做。但是有没有一种简单直接的方法,我指的是一条直线?一种方法是使用将Z中的值转换为a中的绝对索引,然后使用向量索引: idx = sub2ind(size(A), 1:numel(Z

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


我知道我可以用循环来做。但是有没有一种简单直接的方法,我指的是一条直线?

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

idx = sub2ind(size(A), 1:numel(Z), Z);
A(idx) = 1;
或者简单地在一行中:

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

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

idx = sub2ind(size(A), 1:numel(Z), Z);
A(idx) = 1;
或者简单地在一行中:

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

在10000个元素中有100个非零元素的矩阵(因此只有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。

在10000个元素中有100个非零元素(因此总共只有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因为它更简单、更快,所以我想现在删除我的答案:p+1:忘记
稀疏
。编辑:但令人惊讶的是,我对1000x1000矩阵的
sub2ind
full(sparse(…)
进行了计时,并且
sub2ind
的速度几乎快了20倍。你能解释一下吗?同时,对我来说,
sub2ind
的速度要慢5倍。您是否考虑了
A
的创建,即:
A=0(numel(Z))
?这是需要的,否则索引到它是没有用的。@GuntherStruyf我没有。好的,现在
sub2ind
的数量级大致相同(~95%),但仍然比
full(sparse(…)
快。我遗漏了什么?顺便说一下,我注意到这个解决方案正在强制未包含在
Z
中的元素为零。这不是问题所要求的,可能会错过OP的目标。可能只是OP想要将
A
中的某些元素设置为1,而其余元素保持不变。+1因为更简单、更快,我想我现在将删除我的答案:p+1:忘记
sparse
。编辑:但令人惊讶的是,我对1000x1000矩阵的
sub2ind
full(sparse(…)
进行了计时,并且
sub2ind
的速度几乎快了20倍。你能解释一下吗?同时,对我来说,
sub2ind
的速度要慢5倍。您是否考虑了
A
的创建,即:
A=0(numel(Z))
?这是需要的,否则索引到它是没有用的。@GuntherStruyf我没有。好的,现在
sub2ind
的数量级大致相同(~95%),但仍然比
full(sparse(…)
快。我遗漏了什么?顺便说一下,我注意到这个解决方案正在强制未包含在
Z
中的元素为零。这不是问题所要求的,可能会错过OP的目标。可能只是OP希望将
A
中的某些元素设置为1,而其余元素保持不变。