【问题标题】:Initializing a matrix with a certain value in matlab在matlab中初始化具有特定值的矩阵
【发布时间】:2012-12-31 20:10:57
【问题描述】:

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

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

【问题讨论】:

    标签: matlab matrix initialization


    【解决方案1】:

    总共有 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 因为它更容易更快,我想我现在会删除我的答案:p
    • +1:忘了sparse编辑:令人惊讶的是,我为 1000x1000 矩阵计时了 sub2indfull(sparse(...)),而 sub2ind 快了将近 20 倍。你能解释一下吗?
    • 也计时了,sub2ind 对我来说慢了 5 倍。您是否考虑过AA=zeros(numel(Z)) 的创建?这是必需的,否则对它进行索引是没有用的..
    • @GuntherStruyf 我没有。好的,现在sub2ind 的数量级差不多(~95%),但仍然比full(sparse(...)) 快。我错过了什么?
    • 顺便说一句,我刚刚注意到这个解决方案是强制Z 中未包含的元素为零。这不是问题所必需的,并且可能会错过 OP 的目标。可能只是 OP 想要将 A 中的某些元素设置为 1,而其余元素保持不变。
    【解决方案2】:

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

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

    或者干脆单行:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多