忽略矩阵中的NaN元素 - Matlab

时间:2015-04-04 02:27:31

标签: matlab matrix

您好我需要忽略矩阵中的NaN元素,请参阅下面的代码:

Coord = [230 400; 270 420; 300 400;340 430;390 380; 230 300; 
         300 290;370 280;250 200;290 200 ;320 200 ;200 190 
         ;250 100 ;310 120; 410 110; 390 180;];

P =  [1 6 7 3 2 1 NaN NaN;
      3 7 8 5 4 3 NaN NaN;
      6 9 10 7 6 NaN NaN NaN;
      7 10 11 8 7 NaN NaN NaN;
      6 12 13 14 10 9 6 NaN;
      8 11 10 14 15 16 8 NaN];

您可以看到Coord中的总行数和矩阵P的最大值等于16

当我尝试这样做时:Coord(P(1,:),:)
我希望得到什么:

230   400
230   300
300   290
300   400
270   420
230   400

相反,我得到以下错误

  

下标索引必须是实数正整数或逻辑。

3 个答案:

答案 0 :(得分:1)

c = Coords(~isnan(P) | (P > 0))
p = P(~isnan(P) | (P > 0))

答案 1 :(得分:0)

一个好的开始是函数isnan(someVector)。这将在someVector包含someVector值的索引中返回与NaN true相同的逻辑长度。例如,

>> isnan(P(1,:))
    ans = [0 0 0 0 0 0 1 1]
>> notNaN = ~isnan(P(1,:));
>> P(1,notNaN)
    ans = [1 6 7 3 2 1]

这是一种忽略NaN值的方法。对于零,我们可以做类似的事情,但是我们必须创建逻辑测试,而不是为我们做一个函数。你的矩阵没有零值,但这是我如何绕过所述值:

>> nonZero = P(1,P(1,:)~=0)

其中P(1,:)~=0以与isnan(P(1,:))

相同的方式创建逻辑数组

答案 2 :(得分:0)

<强>输入:

P =  [1 6 7 3 2 1 NaN NaN;
      3 7 8 5 4 3 NaN NaN;
      6 9 10 7 6 NaN NaN NaN;
      7 10 11 8 7 NaN NaN NaN;
      6 12 13 14 10 9 6 NaN;
      8 11 10 14 15 16 8 NaN];

Coord = [230 400; 270 420; 300 400;340 430;390 380; 230 300;...
         300 290;370 280;250 200;290 200 ;320 200 ;200 190;...
         250 100 ;310 120; 410 110; 390 180;];

<强>代码:

for i = 1:length(P(:,1))
    Q = P(i,isfinite(P(i, :)));
    disp(Coord(Q,:));
end

<强>输出:

230   400
230   300
300   290
300   400
270   420
230   400

300   400
300   290
370   280
390   380
340   430
300   400

230   300
250   200
290   200
300   290
230   300

300   290
290   200
320   200
370   280
300   290

230   300
200   190
250   100
310   120
290   200
250   200
230   300

370   280
320   200
290   200
310   120
410   110
390   180
370   280