3

这在两个维度上很容易,例如:

>> A = NaN(5,4)
>> A(2:4,2:3) = [1 2; 3 4; 5 6]
>> A(2,2) = NaN                
>> A(4,3) = NaN 

A =

   NaN   NaN   NaN   NaN
   NaN   NaN     2   NaN
   NaN     3     4   NaN
   NaN     5   NaN   NaN
   NaN   NaN   NaN   NaN

>> A(~all(isnan(A),2),~all(isnan(A),1))

ans =

   NaN     2
     3     4
     5   NaN

请注意,保留不全是 NaN 的行和列中的 NaN 值。

如何将其扩展到多个维度?例如,如果 A 具有三个维度:

>> A = NaN(5,4,3)           
>> A(2:4,2:3,2) = [1 2; 3 4; 5 6]
>> A(2,2,2) = NaN                
>> A(4,3,2) = NaN                

A(:,:,1) =

   NaN   NaN   NaN   NaN
   NaN   NaN   NaN   NaN
   NaN   NaN   NaN   NaN
   NaN   NaN   NaN   NaN
   NaN   NaN   NaN   NaN

A(:,:,2) =

   NaN   NaN   NaN   NaN
   NaN   NaN     2   NaN
   NaN     3     4   NaN
   NaN     5   NaN   NaN
   NaN   NaN   NaN   NaN


A(:,:,3) =

   NaN   NaN   NaN   NaN
   NaN   NaN   NaN   NaN
   NaN   NaN   NaN   NaN
   NaN   NaN   NaN   NaN
   NaN   NaN   NaN   NaN

那我怎么得到

ans =

   NaN     2
     3     4
     5   NaN

我想在四个维度上执行此操作,并且矩阵比此处的示例矩阵 A 大得多。

4

2 回答 2

1

试试这个:

2 维

A(~all(isnan(A),2),~all(isnan(A),1))

3 个维度

A(~all(all(isnan(A),2),3),...
  ~all(all(isnan(A),1),3),...
  ~all(all(isnan(A),1),2))

4 个维度

A(~all(all(all(isnan(A),2),3),4),...
  ~all(all(all(isnan(A),1),3),4),...
  ~all(all(all(isnan(A),1),2),4),...
  ~all(all(all(isnan(A),1),2),3))

基本上,规则适用于 N 维:

  • 在所有 N 维度上,您都执行 isnan() 事情。

  • 然后用 all() 函数将其包裹 N-1 次,

  • 并且第 i 个维度的每个 all() 函数的第二个参数应该是数字 1 到 N 的任意顺序,但不包括 i。


由于 Theodros Zelleke 想看看谁的方法更快(很好的说法是他认为他的方法如此之快),这里有一个基准。矩阵 A 定义为:

A = NaN*ones(100,400,3,3);
A(2:4,2:3,2,2) = [1 2; 3 4; 5 6];
A(2,2,2,2) = NaN;A(4,3,2,2) = NaN;
A(5:80,4:200,2,2)=ones(76,197);

他的测试定义为:

tic;
for i=1:100
[i,j,k,z] = ind2sub(size(A),find(~isnan(A)));
l = min([i j k z]);
u = max([i j k z]);
B=A(l(1):u(1),l(2):u(2),l(3):u(3),l(4):u(4));
end
toc

结果:

Elapsed time is 0.533932 seconds.
Elapsed time is 0.519216 seconds.
Elapsed time is 0.575037 seconds.
Elapsed time is 0.525000 seconds.

我的测试定义为:

tic;
for i=1:100
isnanA=isnan(A);
ai34=all(all(isnanA,3),4);
ai12=all(all(isnanA,1),2);
B=A(~all(ai34,2),~all(ai34,1),~all(ai12,4),~all(ai12,3));
end
toc

结果:

Elapsed time is 0.224869 seconds.
Elapsed time is 0.225132 seconds.
Elapsed time is 0.246762 seconds.
Elapsed time is 0.236989 seconds.
于 2012-08-19T13:59:24.393 回答
1

A我根据OP发布的输入解决问题:

>> [i,j,k] = ind2sub(size(A),find(~isnan(A)));
>> l = min([i j k]);
>> u = max([i j k]);
>> B=A(l(1):u(1),l(2):u(2),l(3):u(3))
B =
   NaN     2
     3     4
     5   NaN
>> size(B)
ans =
     3     2

既然您说您想在更大的矩阵上执行此操作,我不确定@ronalchn 解决方案的性能 - 这就是所有的all调用。但我不知道这在多大程度上很重要 - 也许有人可以发表评论......

于 2012-08-19T20:45:36.567 回答