如何找到负值的指数,并将该值替换为恰好为正的最接近指数的值?



我知道如何从矩阵中找到负值的索引。

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]

您可以使用fillmissing函数执行此操作,如下所示:

  1. 将负值替换为NaN。这是必需的,因为对于singledouble输入,fillmissingNaN条目视为缺失值。
  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

这是一个可能的解决方案:

  • 从右到左迭代列。
  • 将列中的每个负值替换为右侧的值。
  • 确保最右边的列(一个过去的矩阵边界(用零初始化。

代码示例:

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

最新更新