2

次のユリウス日付の配列を考えてみましょう

Jday1 = datenum('2011-01-01 00:00','yyyy-mm-dd HH:MM'):60/(60*24):...
    datenum('2011-12-31 23:00','yyyy-mm-dd HH:MM');
Jday2 = datenum('2011-04-01 00:00','yyyy-mm-dd HH:MM'):60/(60*24):...
    datenum('2011-12-31 23:00','yyyy-mm-dd HH:MM');
Jday3 = datenum('2011-02-06 00:00','yyyy-mm-dd HH:MM'):60/(60*24):...
    datenum('2011-12-31 22:00','yyyy-mm-dd HH:MM');

これらはすべて長さが異なり、時間も異なります。

どの日付が 3 つの配列で同じか、つまり、すべての配列間で一貫した dateTime のインデックスを返すにはどうすればよいでしょうか?

サイズが同じであれば strcmp を使用できることはわかっていますが、例のように長さが異なる場合はどうすればよいでしょうか? また、配列の数が 2 ではなく 3 であるため、ここでは strcmp が問題になります。

4

2 に答える 2

4

使用intersect:

common_dates = intersect(intersect(Jday1, Jday2), Jday3);

または、インデックスも必要な場合 (@Robert P. による以下のコメントに基づいて、 inner の位置の変更に注意してくださいintersect):

[common_dates, idx] = intersect(Jday1, intersect(Jday2, Jday3));

アップデート

交差する配列が複数ある場合は、ジョブを処理する小さな関数を記述します。

function varargout = intersectn(varargin)
narginchk(2, Inf);
nargoutchk(0, 2);
x = varargin{nargin}; 
for i = nargin-1:-1:1
    [x, idx] = intersect(varargin{i}, x); 
end
if nargout > 1, varargout{2} = idx; end
if nargout > 0, varargout{1} = x; else disp(x); end
于 2013-06-12T18:50:01.400 に答える
0

配列を文字列ではなくdatenumとして保存しているCompare = (Jday1 == Jday2)ため、それらを比較するだけで済みます。これは、2 つのベクトルが同じ長さの場合にのみ機能します。

ベクトルの長さが異なる場合、 を使用して、 set 内の各インデックスで1 (true) とCompare = ismember(Jday1, Jday2)同じサイズの配列を返すことができます。Jday1iJday1(i)Jday2

ismember に関するドキュメントは、ここにあります。

最後に、あるリストが別のリストと等しいインデックスを返したい場合は、 を試してくださいfind(ismember(Jday1, Jday2))

于 2013-06-12T18:47:13.103 に答える