【问题标题】:Storing blocks of vector data into an array in Matlab在 Matlab 中将矢量数据块存储到数组中
【发布时间】:2016-05-04 22:54:02
【问题描述】:

我在 Matlab 中有一个数组

 A = [1 2 3 4 5 6 7 8 9;
     67 67 67 86 86 86 86 67 67]';

A 的第一行中的每个点都对应一个“代码”6786。我正在尝试提取"67s""86s" 的这些块,这样每次块开始时,相应的元素都会被放入名为 X 的不同数组的第三维中,其中 .

所以例如在 A 中,我有 3 个不同的块,所以我想得到一个大小为 1x9x3 的数组 X。例如,第一个 67 块我想要 X

 X(1,:,1) = [1 2 3];

我知道我会使用 for 循环“填充”这个向量 X

for i=1:size(A,2)
  for j=1:size(A,2) %actually j should be up till the number of blocks present
    X(1,i,j) = A(1,i) 
  end
end 

但这当然是不正确或不完整的,因为首先我不确定如何分离“块”以及如何正确“填充”X(1,i,j) 中的 j。其次,我怎样才能让代码识别有多少块?

谁能帮忙?

谢谢

【问题讨论】:

  • 您确定您的示例数据正确吗?正如您所拥有的那样,您有 4 个 86 条目。
  • @Suever 是的,块大小不一样!
  • 在你的例子中,如果X1x9x3,那么X(1,:,1)应该是一个有9个元素的数组,因此它不能包含[1 2 3]。我建议您查看您的示例。
  • @RafaelMonteiro 我想我无法清楚地解释我的意思。由于我是按块分隔的,因此在 X(:,:,1) 内我只想要第一个块的元素......它们是 1 2 3。
  • 但如果 X 是一个 3 维矩阵,X(:,:,n) 对于每个 n 将具有相同数量的元素。也许cell array 更适合您。例如,您可以使用 X{1} = [1 2 3]X{2} = [4 5 6 7] 之类的内容。

标签: arrays matlab sorting for-loop vector


【解决方案1】:

一种可能的方法,基于this 答案:

>> B = accumarray([0; cumsum(diff(A(:,2)) ~= 0)] + 1, A(:,1), [], @(x) {x}, [])

现在你有了这个:

>> B{1}

ans =

     1
     2
     3

>> B{2}

ans =

     4
     5
     6
     7

>> B{3}

ans =

     8
     9

【讨论】:

    猜你喜欢
    • 2011-12-21
    • 2021-08-28
    • 1970-01-01
    • 2021-04-27
    • 2018-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多