我知道如何从矩阵中找到负值的索引。
matrix(matrix<0) = %something should be done;
但是不知道如何将它们的值替换为恰好为正的最近索引值。
此处最近的索引应位于放置观测索引的同一行中。
如果行中没有具有正值的索引,则应将 0 内插到该行的每个索引。
如果同一行中有多个索引最接近观测索引,请选择正确的索引。
我正在处理 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
函数执行此操作,如下所示:
- 将负值替换为
NaN
。这是必需的,因为对于single
或double
输入,fillmissing
NaN
条目视为缺失值。 - 将
fillmissing
与'nearest'
选项一起使用,并沿维度2
进行操作。如果有两个等距数据值,fillmissing
显然会选择右侧的一个(我没有找到这个文档,也无法从源代码中确认它(。 - 将任何剩余的
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