我有一个数据矩阵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坐标。任何人都可以给我一个帮助吗?非常感谢你!
答案 0 :(得分:1)
我个人会保留另一个介于1
到20
之间的向量,并将您的列移除到循环中。让我们调用此向量column_choice
。在每次迭代时,使用randperm
从column_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_choice
和final_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]) = [];