我有这个大小为10000的矩阵1.我想删除一些行,从随机位置说50。删除行后,矩阵的大小将为9950.那么,如何从原始10000中获取任何元素的索引。我的意思是假设我想将第9999个元素的值作为原始矩阵中的索引。但是现在因为删除了一些行后我的新矩阵的大小是9950,我怎么知道哪个是原始矩阵中的第9999个元素。这样做的最佳方式是什么?
答案 0 :(得分:2)
所以你想随机缩小矩阵,但是还记得每个元素的来源吗?并知道原始元素的最终位置?一种方法是保留一个索引来记住收缩矩阵中的元素来自何处。
假设您的原始矩阵是
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
将为空。
答案 1 :(得分:0)
通常一旦你有要删除的元素索引,你就可以同时删除它们。例如,让我们生成10000个向量A
中的50个元素的随机索引。
rp_idx = randperm(numel(A));
rp_idx_50 = rp(1:50);
然后我们可以将这50个元素删除为
A(rp_idx_50) = [];
如果由于某种原因必须逐个删除元素,请对索引进行排序并从结尾开始。在这种情况下,您不必找到新索引。