0

我有以下数据(或类似数据):

  154240           1           7
  154240           2           2
  154240           5           6
  154240           2           5
  154240           6           7
  154240           2           7
  154240           5           6
  154240           6           7
  154240           4           6
  154240           4           6
  154240           4           6

  641224           2           3
  641224           2           1
  641224           2           3
  641224           1           2

  641311           5           5
  641311           7           5

它表示 [tag number of rat, x coord, y coord] 形式的数据(正如我正在研究的大鼠种群)。我想为标签的每个相同值计算 x 和 y 相对于第一个 x 和 y 条目的位移,即我想要一个 nx3 矩阵(其中 n 是我的数据的大小),它给了我 [标签再次编号,(0,x2-x1,x3-x1,x4-x1 等),(0,y2-y1,y3-y1,y4-y1 等)] 但我现在很困惑。

任何帮助是极大的赞赏!

4

2 回答 2

0

假设你已经有一个矩阵

A = [tag,x,y];

你应该试试

disp(:,1) = A(:,1);    
disp(:,2) = arrayfun(@(ii) A(ii,2) - A(1,2),1:size(A,1));
disp(:,3) = arrayfun(@(ii) A(ii,3) - A(1,3),1:size(A,1));

我希望这有帮助。

于 2013-01-28T22:40:58.800 回答
0

我认为最简单的方法是首先将您的数据拆分为仅包含单个标签的数据集单元数组。然后只需从每个数据集中减去第一行。

您可以使用该diff函数查找第一列更改的索引。这将为您提供拆分数据的所有点。像这样的东西:

splits = find([1; diff(M(:,1)) ~= 0; 1])

打破这一点,我们说第一行总是一个兴趣点。然后索引更改的任何行都是兴趣点。最后,最后一行之后的行也是一个兴趣点。

在你的数据上运行它,我得到这个:

splits =

     1
    12
    16
    18

和理智测试:

>> M(splits(1:end-1),:)

ans =

      154240           1           7
      641224           2           3
      641311           5           5

现在您可以构建您感兴趣的范围:

>> ranges = [splits(1:end-1), splits(2:end)-1]

ranges =

     1    11
    12    15
    16    17

然后,您可以将矩阵中的相关行提取到一个单元格数组中,如下所示:

D = arrayfun( @(x) M(ranges(x,1):ranges(x,2),:), 1:size(ranges,1), 'uniformoutput', false )

现在您有了一个由 3 列矩阵组成的元胞数组,其中每个元胞代表一个标记数据集。这是其中之一:

>> D{2}

ans =

      641224           2           3
      641224           2           1
      641224           2           3
      641224           1           2

现在您可以浏览您的单元格并应用从其余部分中减去第一行的操作。有多种方法可以做到这一点。这对你来说是一个练习。

于 2013-01-28T22:33:51.950 回答