我是Matlab的新手,无法找到解决以下问题的方法:
从使用Matlab的单粒子跟踪程序(准确地说是uTrack)中,我将跟踪结果作为结构。在这个结构内部,每个粒子的轨迹都存储在另一个结构中。在这种结构中,轨道可以通过以下方式找到矩阵(另外两个矩阵也有其他信息):
x coord / y coord / z coord / Amplitude / dx / dy / dz / dA ...
这将是第一次。然后它再次以x coord,y coord开始,依此类推第二个时间点直到结束。
为了进一步评估,我只需要以下列形式的单元格数组中的x和y坐标
[t1 x1 y1;
t2 x2 y2;
t3 x3 y3;
...]
每个粒子的单元格数组中有一个元素。
因此,我需要以某种方式提取x和y坐标,传输它们并在第一列中添加时间信息并使用正确的长度。
我已经尝试将数据转换为矩阵,但问题是轨道当然不是全长相同。然后我得到了很多NaN,导致以下步骤出现问题...
非常感谢任何帮助!
答案 0 :(得分:1)
这里有一些代码可以帮助您在包含每个轨道信息的结构中获取所需的数据。
在我的示例代码中,我为时间,X和Y坐标生成虚拟值,然后将它们放在一个单元格数组中,最终包含您指定格式的数据,每个时间点。
我假设有关该轨道的信息存储在名为DataStruct的结构中,其中的字段名为X_Coord和Y_Coord。在您的情况下,此信息在矩阵中,因此在结构中执行索引的方式将不同。正如你在评论中所说的那样,矩阵的大小是1x8(TimePoints),因此你必须使用重塑来解决这个问题,以便更容易访问其中的元素。
clc;
clear all;
% Generate dummy values
for t = 1:10
DataStruct(t).X_Coord = t;
DataStruct(t).Y_Coord = 10*t+1;
end
Data_Cell = cell(length(DataStruct),3); % Pre-allocation
% Fetch each field of interest and put into cell array, along with the
% time.
for k = 1:length(DataStruct)
Data_Cell(k,:) = {(k) (DataStruct(k).X_Coord) (DataStruct(k).Y_Coord)};
end
Data_Cell
这导致以下单元格数组:
Data_Cell =
[ 1] [ 1] [ 11]
[ 2] [ 2] [ 21]
[ 3] [ 3] [ 31]
[ 4] [ 4] [ 41]
[ 5] [ 5] [ 51]
[ 6] [ 6] [ 61]
[ 7] [ 7] [ 71]
[ 8] [ 8] [ 81]
[ 9] [ 9] [ 91]
[10] [10] [101]
然后,您可以使用cell2mat
转换为双打数组;
希望有助于您入门!
修改强> 按照下面的评论,您可以执行以下操作来识别x和y坐标,这两个坐标都是NaN广告将它们存储在新矩阵中以及相应的时间:
DummyArray = zeros(10,3);
% Generate dummy array with numbers and NaNs.
DummyArray(:,1) = 1:10;
DummyArray(:,2) = [1 2 NaN NaN 5 6 7 8 NaN NaN];
DummyArray(:,3) = [NaN 21 NaN 41 51 NaN 71 81 91 NaN];
这给出了这个虚拟矩阵:
DummyArray =
1 1 NaN
2 2 21
3 NaN NaN
4 NaN 41
5 5 51
6 6 NaN
7 7 71
8 8 81
9 NaN 91
10 NaN NaN
%Find row indices in which both x and y coordinates are actual numbers
NotNaN = DummyArray(~isnan(DummyArray(:,2)) & ~isnan(DummyArray(:,3)));
%Use logical indexing to retrieve the corresponding time, x- and y
%coordinates all in the same matrix.
FinalMatrix = [DummyArray(NotNaN,1) DummyArray(NotNaN,2) DummyArray(NotNaN,3)]
输出如下:
FinalMatrix =
2 2 21
5 5 51
7 7 71
8 8 81
你去了!