在matlab中寻找创建子矩阵的“聪明”方法

在matlab中寻找创建子矩阵的“聪明”方法,matlab,for-loop,matrix,submatrix,Matlab,For Loop,Matrix,Submatrix,我有一个2900 x 7大小的矩阵 re2 = [x y z se index xc yc]; 每个列x、y、z、se、索引、xc、yc都包含数字,所有2900 x 1的大小相同 通过在第6列和第7列中查找特定元素,我试图从这一列中生成一些子矩阵。像这样: rexy_1_1 = re2(xc==1 & yc==1,:); rexy_1_2 = re2(xc==1 & yc==2,:); rexy_1_3 = re2(xc==1 & yc==3,:); rexy_1_4

我有一个2900 x 7大小的矩阵

re2 = [x y z se index xc yc];
每个列x、y、z、se、索引、xc、yc都包含数字,所有2900 x 1的大小相同

通过在第6列和第7列中查找特定元素,我试图从这一列中生成一些子矩阵。像这样:

rexy_1_1 = re2(xc==1 & yc==1,:);
rexy_1_2 = re2(xc==1 & yc==2,:);
rexy_1_3 = re2(xc==1 & yc==3,:);
rexy_1_4 = re2(xc==1 & yc==4,:);
rexy_1_5 = re2(xc==1 & yc==5,:);
....
rexy_20_17 = re2(xc==20 & yc==17,:); 
但这意味着我需要写340行来生成340个子矩阵。有什么聪明的方法可以做到这一点吗?我尝试使用两个for循环:

for i=1:20
    for j=1:17
        rexy_i_j = re2(xc==i & yc==j,:);
    end
end
但它没有起作用


如何获得这些子矩阵?

我同意@EitanT的观点,即您应该使用单元数组,而不是制作许多不同名称的数组。然后您就可以访问这些子矩阵作为rexy{i,j}

要构建此单元阵列,可以使用accumarray,如下所示:

rexy = accumarray(re2(:,6:7),(1:size(re2,1))',[],@(x){re2(x,:)})

我同意@EitanT的观点,即您应该使用单元数组,而不是制作许多不同名称的数组。然后您就可以访问这些子矩阵作为rexy{i,j}

要构建此单元阵列,可以使用accumarray,如下所示:

rexy = accumarray(re2(:,6:7),(1:size(re2,1))',[],@(x){re2(x,:)})

哎哟您不能每次仅通过赋值生成新变量rexy_i_j,即rexy_1_1,rexy_1_2````。这只是超出了字面上命名为rexy_i_j的变量的旧值。我建议改用单元格数组:rexy{I,j}。另外,您是否有名为xc和yc的实际变量?我认为您没有正确提取子矩阵…谢谢,xc和yc是2700 x 1列,包含数字。xc包含1到20个数字,yc包含1到17个数字。哎哟!您不能每次仅通过赋值生成新变量rexy_i_j,即rexy_1_1,rexy_1_2````。这只是超出了字面上命名为rexy_i_j的变量的旧值。我建议改用单元格数组:rexy{I,j}。另外,您是否有名为xc和yc的实际变量?我认为您没有正确提取子矩阵…谢谢,xc和yc是2700 x 1列,包含数字。xc包含1到20个NUMBERS,yc包含1到17个NUMBERS。这很狡猾-我以前从未见过Accumaray这样使用。如果在创建单元格数组后不需要保留xc和yc,可以将最后一个参数也更改为re2x,1:5。@user1798797:不客气。请考虑接受我的答案,如果它是狡猾的,我以前没有见过这样的累积数组。如果在创建单元格数组后不需要保留xc和yc,可以将最后一个参数也更改为re2x,1:5。@user1798797:不客气。如果有帮助的话,请考虑接受我的回答。