如何恢复已删除元素的原始位置?

Peter Li

我有一个数据矩阵A,其大小为4 * 20(4行,20列)。矩阵A由A = randn(4,20)生成。

在第一次迭代中,我删除矩阵A的列[2,3]。然后矩阵A变成矩阵A1,其大小为4 * 18。

在第二次迭代中,我删除矩阵A1的列[4 8 10]。然后,矩阵A1变为矩阵A2,其大小为4 * 15。

在第三次迭代中,我删除矩阵A2的列[1 3 6 9 10]。然后,矩阵A2变为矩阵A3,其大小为4 * 10。

删除的元素放在矩阵B中。我的问题是如何计算出B中每个删除元素的原始矩阵A中的x和y坐标。有人可以给我帮助吗?太感谢了!

雷瑞恩

我个人将保留另一个向量,范围介于1之间20,并将删除的列放入循环中。我们称这个向量column_choice在每次迭代中,用于randpermcolumn_choice要删除的列中随机选择,然后将其附加到矩阵中B选择这些列后,从中删除这些元素,column_choice然后继续执行代码。同样,column_choice我们的那些列将添加到另一个向量中final_columns该向量将告诉您最终最终删除了哪些向量,并且您可以在原始矩阵中引用这些列。

为了使事情高效,请创建一个数组,其中的每个元素都包含您要在每次迭代中删除的列总数。因此,请执行以下操作:

cols_to_remove = [2 3 5];

第一个元素表示要在第一次迭代中删除2列,第二个元素意味着要在第二次迭代中删除3列,并在最后一次迭代中删除5列。因为您正在循环,所以预先分配矩阵是个好主意。总共将要删除10列并将其填充到中B,并且由于您的随机矩阵有4行,因此您应该执行以下操作:

B = zeros(4,sum(cols_to_remove));

我们正在总结,cols_to_remove因为这告诉我们最终最终将删除总共多少列。我想提到的一件事是,A在我们开始删除列之前,您应该制作一个副本这样,您就可以引用回原始矩阵。

最后,不用费劲,这是我要编写的用于解决此问题的代码:

column_choice = 1 : 20;
cols_to_remove = [2 3 5];
B = zeros(4,sum(cols_to_remove));
final_columns = zeros(1,sum(cols_to_remove));
A = randn(4,20); %// From your post
Acopy = A; %// Make a copy of the matrix

%// Keep track of which column we need to start populating
%// B at
counter = 1;

%// For each amount of columns we want to remove...
for cols = cols_to_remove

    %// Randomly choose the columns we want to remove
    to_remove = randperm(numel(column_choice), cols);

    %// Remove from the A matrix and store into B
    removed_cols = Acopy(:,to_remove);
    Acopy(:,to_remove) = [];
    B(:,counter : counter + cols - 1) = removed_cols;

    %// Also add columns removed to final_columns
    final_columns(counter : counter + cols - 1) = column_choice(to_remove);

    %// Increment counter for the next spot to place columns
    counter = counter + cols;

    %// Also remove from column_choice
    column_choice(to_remove) = [];


    %// Continue your code here to process A and/or B
    %//... 
    %//...
end

%// Remove copy to save memory
clear Acopy;

因此,final_columns将为您提供从原始矩阵中删除了哪些列,并且您可以返回A以查找这些位置。B将包含从中删除的列,A并将它们全部串联在一起。

编辑

根据您的评论,您想要从每个中间结果中删除某些行。这样,您可以在每个矩阵的第二维中指定要删除的列,然后将其设置为[]在删除列之前,请确保将每个结果复制到新矩阵中。此外,你需要跟踪哪些指数从你删除原来的矩阵,所以作出这样的column_choicefinal_columns载体再次重复保存的逻辑,我们已经谈过了。

所以:

column_choice = 1:20;
final_columns = zeros(1,10);
A1 = A;
A1(:,[2 3]) = [];
final_columns(1:2) = column_choice([2 3]);
column_choice([2 3]) = [];
A2 = A1;
A2(:,[4 9 11]) = [];
final_columns(3:5) = column_choice([4 9 11]);
column_choice([4 9 11]) = [];
A3 = A2;
A3(:,[1 2 5 8 12]);
final_columns(6:10) = column_choice([1 2 5 8 12]);
column_choice([1 2 5 8 12]) = [];

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章