我有一个数据矩阵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
。在每次迭代中,用于randperm
从column_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_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]) = [];
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句