MATLAB从矩阵中删除NaN值并向左移动值
我试图计算以下矩阵中的列差异:MATLAB从矩阵中删除NaN值并向左移动值,matlab,Matlab,我试图计算以下矩阵中的列差异: A = 0 NaN NaN 0.3750 NaN NaN 0.1250 0.2500 0.3750 NaN 我想获得: 0.3750 NaN NaN 0.1250 0.1250 0.1250 在这里,我基本上采用了列式差异,跳过NaN值并将值向左移动 一维情况是: A = [0 NaN 0.250 0.375 NaN 0.625]; NaN_diff(A) = [0
A =
0 NaN NaN 0.3750 NaN
NaN 0.1250 0.2500 0.3750 NaN
我想获得:
0.3750 NaN NaN
0.1250 0.1250 0.1250
在这里,我基本上采用了列式差异,跳过NaN值并将值向左移动
一维情况是:
A = [0 NaN 0.250 0.375 NaN 0.625];
NaN_diff(A) = [0.250 0.125 0.250];
有没有办法在MATLAB中高效地执行此操作,而不使用每行低效的find()查询?以下是一个解决方案,它将大多数操作矢量化:
notNan = ~isnan(A);
numNN = sum(notNan,2);
shifted = NaN(size(A));
for r = 1:size(A,1)
myRow = A(r,:);
shifted(r,1:numNN(r)) = myRow(notNan(r,:));
end
nanDiff = diff(shifted,1,2);
以下是另一种矢量化解决方案:
%// Convert to cell array without NaNs
[rows, cols] = size(A);
C = cellfun(@(x)x(~isnan(x)), mat2cell(A, ones(1, rows), cols), 'Uniform', 0);
%// Compute diff for each row and pad
N = max(sum(~isnan(A), 2));
C = cellfun(@(x)[diff(x) nan(1, N - length(x))], C, 'Uniform', 0);
%// Convert back to a matrix
nandiff = vertcat(C{:});
如果您想用零而不是
NaN
值填充结果矩阵,请将NaN(1,N-length(x))
中的NaN
函数调用更改为zero
,这里有一种替代方法,它确实要求您循环每一行,但仍应具有良好的性能,并且对我来说非常直观
B = NaN(size(A,1),size(A,2)-1)
for i = 1:size(A,1)
idx = ~isnan(A(:,i))
B(i,1:sum(idx)) = diff(A(i,idx))
end
我知道这是一个相当古老的问题,但对于像我这样偶然进入这一页的人来说,这里有一个更简单(imho)的问题解决方案:
A = [0 NaN 0.250 0.375 NaN 0.625];
A(isnan(A))=[]; % identify index of NaN values and remove them from the array
B = diff(A);
下面是另一个不使用循环的简单解决方案[但假设所有值都是升序]:
A=[0 NaN NaN 0.3750 NaN;NaN 0.1250 0.2500 0.3750 NaN]
A(isnan(A(:,1)))=0;
B=sort(A,2);
C=diff(B,1,2)
这还不清楚,如果要“跳过NaN”,那么为什么示例输出中仍然有NaN?对不起,我添加了这些NaN是为了确保矩阵是矩形的-数字越多的行的差异就越大。它们可以任意为零。我得到了一个
下标赋值维度不匹配
错误。也许您的意思是for循环中的1:numNN(r)
?