47 lines
1.8 KiB
Matlab
47 lines
1.8 KiB
Matlab
function [N, D] = mergeResultsWithM(N1, D1, N2, D2, C1, C2, k, m)
|
|
% Merge neighbors from two sources with a limit on candidate neighbors (m)
|
|
|
|
numQueries = size(N1, 1); % Number of queries in this subset
|
|
maxCandidates = min(m, size(N1, 2) + size(N2, 2)); % Maximum candidates to consider
|
|
|
|
% Combine distances and neighbors
|
|
N_combined = [N1, N2 + size(C1, 1)]; % Adjust indices for C2
|
|
D_combined = [D1, D2];
|
|
|
|
% Sort distances and keep only top-m candidates for each query
|
|
[D_sorted, idx] = sort(D_combined, 2, 'ascend');
|
|
D_sorted = D_sorted(:, 1:maxCandidates); % Keep only top-m distances
|
|
idx = idx(:, 1:maxCandidates); % Keep indices corresponding to top-m distances
|
|
|
|
% Select the corresponding neighbors
|
|
%N_sorted = N_combined(sub2ind(size(N_combined), ...
|
|
% repmat((1:numQueries)', 1, maxCandidates), idx));
|
|
N_sorted = zeros(numQueries, maxCandidates); % Initialize output
|
|
for i = 1:numQueries
|
|
for j = 1:maxCandidates
|
|
N_sorted(i, j) = N_combined(i, idx(i, j));
|
|
end
|
|
end
|
|
|
|
% Handle cases where m < k
|
|
if maxCandidates < k
|
|
% Pad with Inf distances and invalid indices
|
|
D_sorted = [D_sorted, Inf(numQueries, k - maxCandidates)];
|
|
N_sorted = [N_sorted, zeros(numQueries, k - maxCandidates)];
|
|
end
|
|
|
|
% Extract top-k from the reduced set of candidates
|
|
[D, idx_final] = sort(D_sorted, 2, 'ascend');
|
|
D = D(:, 1:k); % Final top-k distances
|
|
%N = N_sorted(sub2ind(size(N_sorted), ...
|
|
% repmat((1:numQueries)', 1, k), idx_final(:, 1:k)));
|
|
% Extract top-k neighbors using a loop
|
|
N = zeros(numQueries, k); % Initialize output
|
|
for i = 1:numQueries
|
|
for j = 1:k
|
|
N(i, j) = N_sorted(i, idx_final(i, j));
|
|
end
|
|
end
|
|
|
|
end
|