Следующий код заменяет каждое отрицательное число ближайшим неотрицательным числом. Если на одном и том же минимальном расстоянии есть несколько неотрицательных чисел, используется первое в линейном порядке .
Без l oop
Это создает очень большая матрица как промежуточный результат. Он может не работать для больших входов из-за ограничений памяти.
matrix = [-255 4 6; -5 -4 5; -400 3 16; -6 -7 -8; 13 -5 14];
[r_use, c_use] = find(matrix>=0); % row and column indices of useful values
z_use = r_use+1j*c_use; % same as complex number
[r_neg, c_neg] = find(matrix<0); % row and column indices of negative values
z_neg = r_neg+1j*c_neg; % same as complex number
[~, ind_min] = min(abs(bsxfun(@minus, z_use, z_neg.')), [], 1); % compute distance
% between each useful value and each negative value. For each negative value,
% give index of nearest useful value. This index is referred to r_use, c_use
ind_use = sub2ind(size(matrix), r_use(ind_min), c_use(ind_min)); % linear indices
% of useful values that will replace the negative values
ind_neg = sub2ind(size(matrix), r_neg, c_neg); % linear indices of negative values
matrix(ind_neg) = matrix(ind_use); % replace
До:
matrix =
-255 4 6
-5 -4 5
-400 3 16
-6 -7 -8
13 -5 14
После:
matrix =
4 4 6
4 4 5
3 3 16
13 3 16
13 13 14
С l oop
Это уменьшает потребление памяти, работая с отрицательными значениями по одному, используя al oop.
matrix = [-255 4 6; -5 -4 5; -400 3 16; -6 -7 -8; 13 -5 14];
[r_use, c_use] = find(matrix>=0); % row and column indices of useful values
z_use = r_use+1j*c_use; % same as complex number
[r_neg, c_neg] = find(matrix<0); % row and column indices of negative values
z_neg = r_neg+1j*c_neg; % same as complex number
for k = 1:numel(z_neg) % for each negative value
[~, ind_min_k] = min(abs(z_use-z_neg(k))); % compute distance between
% each useful value and this negative value. Give index of nearest
% useful value. This index is referred to r_use, c_use
ind_use_k = sub2ind(size(matrix), r_use(ind_min_k), c_use(ind_min_k));
% linear index of useful value that will replace this negative value
ind_neg_k = sub2ind(size(matrix), r_neg(k), c_neg(k)); % linear index
% of this negative value
matrix(ind_neg_k) = matrix(ind_use_k); % replace
end