【问题标题】:Looking for "clever" way of creating submatrices in matlab寻找在matlab中创建子矩阵的“聪明”方式
【发布时间】:2012-11-05 16:09:52
【问题描述】:

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

re2 = [x y z se index xc yc];

每一列 (x, y, z, se, index, 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

但它不起作用。

我怎样才能得到这些子矩阵?

【问题讨论】:

  • 哎哟!您不能每次都生成一个新变量rexy_i_j rexy_1_1, rexy_1_2`` 只需通过赋值即可。这只会超出字面上名为rexy_i_j 的变量的旧值。我建议使用单元格数组而不是:rexy{i, j}。另外,您是否有名为 xcyc 的实际变量?我认为您没有正确提取子矩阵...
  • 谢谢,xc 和 yc 是 2700 x 1 列,包含数字。 xc 包含从 1 到 20 的数字,yc 包含 1 到 17。

标签: matlab for-loop matrix submatrix


【解决方案1】:

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

要构造这个元胞数组,可以使用accumarray,如下:

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

【讨论】:

  • 这很狡猾——我以前从未见过这样使用 accumarray。如果在创建元胞数组后不需要保留 xc 和 yc,也可以将最后一个参数更改为 re2(x,1:5)。
  • @user1798797:不客气。如果有帮助,请考虑接受我的回答
猜你喜欢
  • 2011-09-01
  • 1970-01-01
  • 2020-05-16
  • 2012-03-16
  • 2018-08-10
  • 1970-01-01
  • 2016-03-08
  • 2021-02-02
  • 1970-01-01
相关资源
最近更新 更多