在matlab中用nan值重新格式化矩阵

时间:2012-10-26 10:42:08

标签: matlab matrix

这篇文章是关于矩阵重组的前一个问题:

  

re-formatting a matrix in matlab

以下示例演示了我面临的另一个问题:

depth = [0:1:20]';
data = rand(1,length(depth))';
d = [depth,data];
d = [d;d(1:20,:);d];

这里我想改变这个矩阵,以便每列代表一个特定的深度,每行代表时间,所以最终我将有3行(即天)和21列(即每个深度的测量)。但是,我们无法重塑这一点,因为给定日期的测量数量不同,即有些缺失。这是众所周知的:

dd = sortrows(d,1);
for i = 1:length(depth);
    e(i) = length(dd(dd(:,1)==depth(i),:));
end

来自' e'我们发现不同天数的深度数不同。如何在矩阵中插入一个nan,以便每天都有相同的深度值?我可以先找到独特的深度:

独特(d(:,1)) 由此,如果某一天缺少深度(来自唯一),我希望将深度插入到正确的位置,并将nan插入数据列中的相应位置。如何实现这一目标?

2 个答案:

答案 0 :(得分:5)

你正确地想到unique可能会派上用场。您还需要第三个输出参数,它将唯一深度映射到原始d向量中的位置。看看这段代码 - 评论说明我做了什么

% find unique depths and their mapping onto the d array
[depths, ~, j] = unique(d(:,1));

% find the start of every day of measurements
% the assumption here is that the depths for each day are in increasing order 
days_data = [1; diff(d(:,1))<0];

% count the number of days
ndays = sum(days_data);

% map every entry in d to the correct day
days_data = cumsum(days_data);

% construct the output array full of nans
dd = nan(numel(depths), ndays);

% assing the existing measurements using linear indices
% Where data does not exist, NaN will remain
dd(sub2ind(size(dd), j, days_data)) = d(:,2)

dd =

0.5115    0.5115    0.5115
0.8194    0.8194    0.8194
0.5803    0.5803    0.5803
0.9404    0.9404    0.9404
0.3269    0.3269    0.3269
0.8546    0.8546    0.8546
0.7854    0.7854    0.7854
0.8086    0.8086    0.8086
0.5485    0.5485    0.5485
0.0663    0.0663    0.0663
0.8422    0.8422    0.8422
0.7958    0.7958    0.7958
0.1347    0.1347    0.1347
0.8326    0.8326    0.8326
0.3549    0.3549    0.3549
0.9585    0.9585    0.9585
0.1125    0.1125    0.1125
0.8541    0.8541    0.8541
0.9872    0.9872    0.9872
0.2892    0.2892    0.2892
0.4692       NaN    0.4692

您可能想要转置矩阵。

答案 1 :(得分:1)

您的问题并不完全清楚您的数据究竟是什么样的,但以下内容可能会帮助您找到答案。

假设您有一个列向量

day1 = 1:21';

并且,最初,所有值均为NaN

day1(:) = NaN

接下来假设您有一个二维测量数组,其中第一列表示深度,第二列表示这些深度处的测量值。例如

msrmnts = [1,2;2,3;4,5;6,7] % etc

然后是作业

day1(msrmnts(:,1)) = msrmnts(:,2)

将仅在day1的{​​{1}}行中设置值,这些行的索引位于msrmnts的第一列中。第二个语句使用Matlab的功能将一个数组作为一组索引用于另一个数组,例如

d([9 7 8 12 4])= 1:5

会将[9 7 8 12 4]的元素d设置为值1:5。请注意,元素的索引不需要按顺序排列。您甚至可以在索引数组中多次插入相同的值,例如[4 4 5 6 3 4],尽管它不是非常有用。