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また、一意の深度を元のベクトルの位置にマップする 3 番目の出力引数も必要です。このコードを見てください - コメントは私が何をしているのかを説明しています

% 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

次に、測定値の 2 次元配列があるとします。最初の列は深度を表し、2 番目の列はそれらの深度での測定値を表します。例えば

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

次に課題

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

day1の最初の列にあるインデックスの行のみに値を設定しますmsrmnts。この 2 番目のステートメントは、ある配列を別の配列への一連のインデックスとして使用するための Matlab の機能を使用します。たとえば、

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

の要素[9 7 8 12 4]d値に設定します1:5。要素のインデックスは順番通りである必要はないことに注意してください。同じ値をインデックス配列に数回挿入することもできますが[4 4 5 6 3 4]、これはあまり役に立ちません。

于 2012-10-26T10:59:08.797 に答える