1

这篇文章遵循之前关于矩阵重组的问题:

在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 插入矩阵中,以便每天具有相同的深度值?我可以通过以下方式首先找到独特的深度:

unique(d(:,1)) 由此,如果给定日期缺少深度(来自唯一),我想将深度插入到正确的位置,并将 nan 插入数据列中的相应位置。如何做到这一点?

4

2 回答 2

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

您可能想要转置矩阵。

于 2012-10-26T11:04:03.690 回答
1

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

假设你有一个列向量

day1 = 1:21';

并且,最初,所有的值都是NaN

day1(:) = NaN

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

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

然后分配

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

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

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

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

于 2012-10-26T10:59:08.797 回答