Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/reporting-services/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MATLAB从矩阵中删除NaN值并向左移动值_Matlab - Fatal编程技术网

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)