私は2つのソートされたベクトルx
とy
を持っています。それぞれy(i)
については、最初のインデックスj
はy(i) >= x(j)
となります。別のベクトルの最初の大きいか等しい値のインデックスを見つける
例:
x = [1 3 5 7 9 11 13 15]
y = [3 4 5 9 10 11]
result = [2 2 3 5 5 6]
それを行うための最も効率的な方法は何ですか? bsxfun
とmin
を使用して
私は2つのソートされたベクトルx
とy
を持っています。それぞれy(i)
については、最初のインデックスj
はy(i) >= x(j)
となります。別のベクトルの最初の大きいか等しい値のインデックスを見つける
例:
x = [1 3 5 7 9 11 13 15]
y = [3 4 5 9 10 11]
result = [2 2 3 5 5 6]
それを行うための最も効率的な方法は何ですか? bsxfun
とmin
を使用して
が頭に浮かぶ:
[~,result] = min(bsxfun(@gt, y(:), x(:).'), [], 2)
あなたはy
列の上に複製されるとx
が行の上に複製されると2つの2Dのマトリックスを作成することができ、放送を利用することができます。私は、の逆のを取ります。それぞれの値がy
の場合、最初の場所はで、最も小さいのはです。その結果、y
に各値の解が与えられます。私はmax
を使ってこれに接近し、比較操作を逆にしてもいいかもしれませんが、私はこの方法がより好きです。
>> x = [1 3 5 7 9 11 13 15]
x =
1 3 5 7 9 11 13 15
>> y = [3 4 5 9 10 11]
y =
3 4 5 9 10 11
>> [~,result] = min(bsxfun(@gt, y(:), x(:).'), [], 2)
result =
2
3
3
5
6
6
私はあなたがベクトルxが部分的に注文した(したがって、単調されているので、線形補間:)
のためにこれを使用するつもりな感覚を持っています)、y内のすべての項目に対してxを横断する必要があります。次のコードは、MATLABで動作するはずです:
lastOccurrence=1
for i = 1:length(y)
for j = lastOccurrence:length(x)
if y(i)<x(j)
lastOccurence=j-1
result(i) = j-1
break
end
end
end
はい、あなたの権利です。ありがとう。 – sisaman
問題ありません。私はあなたの最終目標が何であるかを知っているので、私はあなたのために適切な複製をマークしました。がんばろう! – rayryeng