【问题标题】:Get the new indices of elements after removing some rows from a matrix从矩阵中删除一些行后获取元素的新索引
【发布时间】:2012-04-15 16:44:31
【问题描述】:

我有这个大小为 10000 x 1 的矩阵。我想从随机位置删除一些行,比如说 50。删除行后,矩阵的大小将为 9950。那么,如何从原始 10000 中获取任何元素的索引。我的意思是假设我想获取第 9999 个元素的值作为原始矩阵中的索引。但是现在由于删除了一些行后我的新矩阵的大小是 9950,我怎么知道原始矩阵中的第 9999 个元素。最好的方法是什么?

【问题讨论】:

  • 这取决于您如何删除行——您能否提供一小段(可重现)代码的 sn-p 演示创建矩阵以及您如何决定要删除哪些行以便我们可以解决它?干杯。
  • 我想通了。我可以只使用原始索引 - 删除的元素数来获取新矩阵中元素的索引。
  • 不,你不能。如果原始索引是(比如说)40,那么减去删除的数字(50)就是 -10,这不是一个有效的索引。您必须减去删除的元素数直到该原始索引(因此,您应该存储已删除元素的索引)。
  • 是的,这正是我所做的。我想我忘了在我的评论中提到这一点。但是感谢您指出这一点

标签: matlab


【解决方案1】:

所以你想随机收缩矩阵,但还记得每个元素是从哪里来的吗?并且知道原始元素在哪里结束吗?一种方法是保留一个索引来记住缩小矩阵中的元素来自何处。

假设你的原始矩阵是

A = rand(10000,1);

记住这些元素来自哪里的索引是:

A_idx = [1:length(A)]';

现在,借用@yuk,让我们随机删除一些元素:

rp_idx      = randperm(numel(A));
kill        = rp_idx(1:50);
A(kill)     = [];
A_idx(kill) = [];

现在,无论您多次按照此过程删除元素,A(i) 的原始位置是 A_idx(i)

现在可以在

处找到原始矩阵的第 k 个元素
new_idx = find( A_idx == k )

在新的收缩矩阵中。请注意,如果您要查找的元素是已删除的元素之一,new_idx 将为空。

【讨论】:

    【解决方案2】:

    通常,一旦您有要删除的元素索引,您就会同时将它们全部删除。例如,让我们从 10000 个向量 A 中生成 50 个元素的随机索引。

    rp_idx = randperm(numel(A));
    rp_idx_50 = rp(1:50);
    

    然后我们可以将这 50 个元素移除为

    A(rp_idx_50) = [];
    

    如果您出于某种原因必须一个一个地删除元素,请对索引进行排序并从末尾开始。在这种情况下,您不必查找新索引。

    【讨论】:

      猜你喜欢
      • 2021-11-01
      • 2019-11-09
      • 1970-01-01
      • 1970-01-01
      • 2014-09-21
      • 2012-02-13
      • 2019-05-29
      • 2020-06-27
      • 2023-01-02
      相关资源
      最近更新 更多