Как найти индексы с отрицательным значением и заменить значение ближайшим значением индекса, которое оказывается положительным? - PullRequest
2 голосов
/ 15 января 2020

Я знаю, как найти индексы с отрицательным значением из матрицы.

matrix(matrix<0) = %something should be done;

Но не знаю, как заменить их значения на значение ближайшего индекса, которое оказывается положительным.

  1. Ближайший индекс здесь должен находиться в той же строке, где проложен наблюдаемый индекс.

  2. Если в строке нет индекса с положительным значением , 0 следует интерполировать на каждый индекс в этой строке.

  3. Если в одной и той же строке более одного индекса, ближайшего к наблюдаемому индексу, выберите правильный.

  4. Я имею дело с одиночной матрицей 1003x1170. Поэтому было бы лучше, если бы решение не доставляло слишком много накладных расходов.

Например,

[-255  4  6; 
   -5 -4  5; 
 -400  3  6; 
   -6 -7 -8;
    3 -5  4] 

Становится

[4 4 6; 
 5 5 5; 
 3 3 6;
 0 0 0;
 3 4 4]

Ответы [ 2 ]

6 голосов
/ 15 января 2020

Вы можете сделать это, используя функцию fillmissing, как указано ниже:

  1. Заменить отрицательные значения на NaN. Это необходимо, потому что для single или double ввода fillmissing рассматривает NaN записи как пропущенные значения.
  2. Используйте fillmissing с опцией 'nearest' и работает по измерению 2 , Если есть два равноудаленных значения данных, fillmissing , по-видимому, выбирает одно справа (я не нашел это документированным и не смог подтвердить его из исходного кода).
  3. Заменить все оставшиеся значения NaN (соответствующие строкам, которые не содержат неотрицательных значений) на 0.

matrix = [-255 4 6; -5 -4  5; -400 3 6; -6 -7 -8; 3 -5 4];  % data
matrix(matrix<0) = NaN;                                     % step 1
matrix = fillmissing(matrix, 'nearest', 2);                 % step 2
matrix(isnan(matrix)) = 0;                                  % step 3
2 голосов
/ 15 января 2020

Вот возможное решение:

  • Перебор столбцов справа налево.
  • Замените каждое отрицательное значение в столбце значением справа.
  • Убедитесь, что самый правый столбец (один за пределами матрицы) инициализируется нулями.

Пример кода:

A = [  -255     4     6
         -5    -4     5
       -400     3     6
         -6    -7    -8
          3    -5     4];

[rows, cols] = size(A);

P = zeros(rows, 1); %Column to the right of c initialize to zeros (like padding right side of A with zeros column).

%Loop over columns from right to left
for c = cols:-1:1
    if c < cols
        P = A(:, c+1); %Column to the right of c - assumed to be all positive (or zeros).
    end

    C = A(:, c); %Column c.
    C(C < 0) = P(C < 0); %Replace negative elements with elements from right column (all elements in P are positive or zeros).
    A(:, c) = C; %Replace column in C
end

Результат:

A =

     4     4     6
     5     5     5
     3     3     6
     0     0     0
     3     4     4
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...