1

私は次のことを行う(効率的な)MATLABコードを書き込もうとしています。

約100,000の2次元データポイントがあり、間隔のペアがあります。最初の間隔は変化せず(この例では0と1の間)、2番目の間隔は変化し続けます。
次のようなインスタンス/データポイントを取得したい:

1)最初の間隔内のx座標値(0,1)
2)2番目の間隔内のy座標値(間隔の変更)

% firstCol is a ~100,000 rows, one column array; x-coordinate
% secondCol is also a ~100,000 rows, one column array; y-coordinate

% boundaries of my first interval
%
maxOfMyFirstInterval = 1;
minOfMyFirstInterval = 0;

% allIntervalsMax is a ~10,000 rows, one column, of maximum values
% allIntervalsMin is a ~10,000 rows, one column, of minimum values
% 
% The above two columns contain the changing pairs, so the first pair would be
% (allIntervalsMin(1), allIntervalsMax(1))
%

% pre-allocate array that will hold number of data-points that satisfy 
% my condition
%
numberOfInstances = zeros(length(allIntervalsMax),1);

tic

% This will get the instances that satisfy my first condition,
% x-coordinate between 0 and 1
%
a_first = find((firstCol <= maxOfMyFirstInterval) & ...
    (firstCol >= minOfMyFirstInterval));

% Loop through the list of second intervals
%
for jx = 1:length(allIntervalsMax)

    a_second = find((secondCol <= allIntervalsMax(jx)) & ...
        (secondCol >= allIntervalsMin(jx)));

    a_both = intersect(a_first, a_second);

    numberOfInstances(jx) = length(a_both);
end

toc

それを行うのにかかる時間は約29秒ですが、もっと速い方法があるかどうか疑問に思いました。

4

1 に答える 1

3

検索と交差を気にしなければ、おそらく高速化されるでしょう。そう

a_first = (firstCol <= maxOfMyFirstInterval) & ...
    (firstCol >= minOfMyFirstInterval);

% Loop through the list of second intervals
%
for jx = 1:length(allIntervalsMax)

    a_second = (secondCol <= allIntervalsMax(jx)) & ...
        (secondCol >= allIntervalsMin(jx));

    a_both = a_first & a_second;

    numberOfInstances(jx) = sum(a_both);
end
于 2012-06-19T07:07:53.267 に答える