我有以下数据(或类似):
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
它代表形式的数据[大鼠的标签号,x坐标,y坐标](因为我正在研究大鼠群体)。我想计算x&的位移。 y关于第一个x& y标签的每个相同值的条目,即我想要一个nx3矩阵(其中n是我的数据的大小),它再次给我[标签号,(0,x2-x1,x3-x1,x4-x1等) ),(0,y2-y1,y3-y1,y4-y1等)]但我现在感到很沮丧。
非常感谢任何帮助!
答案 0 :(得分: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
现在,您可以浏览单元格并应用从其余单元格中减去第一行的操作。有多种方法可以做到这一点。这是你的练习。
答案 1 :(得分: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));
我希望这会有所帮助。