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

时间:2014-10-06 21:52:34

标签: matlab

我有一个数据矩阵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 个答案:

答案 0 :(得分:1)

我个人会保留另一个介于120之间的向量,并将您的列移除到循环中。让我们调用此向量column_choice。在每次迭代时,使用randpermcolumn_choice中随机选择要删除的列,然后将这些列附加到矩阵B。选择这些列后,请从column_choice中删除这些元素并继续使用您的代码。此外,column_choice中的这些列我们将添加到另一个向量...称之为final_columns。此向量将告诉您最终最终删除了哪些向量,并且可以在原始矩阵中引用这些列。

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

cols_to_remove = [2 3 5];

第一个元素表示要在第一个迭代中删除2个列,第二个元素表示要在第二个迭代中删除3个列,在最后一个迭代中删除5个列。因为您正在循环,所以预先分配矩阵是一个好主意。总的来说,您将在B中删除并填充10列,并且由于您的随机矩阵有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]) = [];