2

ソートされたベクター内の挿入ポイントを検索するにはどうすればよいですか?

言い換えれば、Octave の「ルックアップ」関数に相当する Matlab は次のとおりです

さらなる説明:

これが私がやりたいことです:

res = bsxfun(@gt, A * B, c);

ここで、A と B は大きなスパース行列で、c は非負の列ベクトルです。

残念ながら、c と比較する前に、行列 A * B には非ゼロ要素が多すぎてメモリに収まらないため、この乗算を直接行うことはできません。

代わりに、各行の非ゼロ要素の数に上限を設定します。

counts = spones(A) * sum(spones(B),2);

次に、counts 配列を合計がほぼ等しい n 個の部分に分割します。Octave では、次のように言います。

cs = cumsum(counts)';
sectionSize = ceil(cs(end) / n);
places = lookup(cs, (0:n) * sectionSize);
bounds = [places(1:n) + 1; places(2:(n+1))];

これで、マシンのすべてのメモリを使い果たすことなく、res を 1 つずつ構築できます。

res = sparse(size(A,1),size(B,2));
for b = bounds
    res(b(1):b(2),:) = bsxfun(@gt,A(b(1):b(2),:) * B,c(b(1):b(2)));
end

これを行う方法についてのより良いアイデアを歓迎します。特に、Matlab は、この方法でインデックスを作成して res 配列を構築すべきではないと警告しているためです。

4

4 に答える 4

0

これはまさにあなたが探しているものだと思います

 x = primes(10)
 y = 4;
 pos = find(x>y,1)-1

vectorxと valueを考慮すると、ポイントの後yに挿入する必要がありますypos

于 2013-10-25T13:03:47.910 に答える
0

オクターブ:

octave:6> lookup([1:10], [3 7])
ans =

   3   7

マトラブ:

>> find(ismember([1:10], [3 7]))

ans =

     3     7
于 2013-10-25T05:01:10.520 に答える
0

基本的な
lookup(table,y)
機能については、
floor(interp1(table,val,y))
またはさらに優れた機能
floor(interp1q(table,val,y))
を使用できます
val = (1:length(table))'

(パラメーターの要件については、それぞれのヘルプを参照してくださいinterp1。) 他の機能も同様に取得できます。 interp1qtable
lookup

于 2014-06-02T09:34:31.637 に答える
0

の 2 番目の出力は、histc探しているものです。完全なビルトインなので、かなり高速です。

octaveslookupと同様に、次のように使用できます。

[~, idx] = histc(y, table)

Wheretableは、 の値yが挿入される並べ替えられたベクトルです。

于 2014-06-02T09:46:57.313 に答える