如何在 Matlab 中将 NaN 分配给值 j < k

How to assign NaN to values j < k in Matlab

我是 Matlab 新手,我想将 NaN 值分配给大小为 (j, k, l) 的数组,无论维度是 j < k 还是 j < l。我如何最有效地做到这一点?

使用花式向量化:

% this may be memory expensive for big matrices:
[j,k,l]=meshgrid(1:size(A,1),1:size(A,2),1:size(A,3));

% Tada!
A(j<k | k<l)=NaN;

如果您没有足够的 RAM(或者不想为此使用它),那么最好的选择就是 loopy:

for jj=1:size(A,1)
   for k=1:size(A,2)
       for l=1:size(A,3)
           if (jj<k | k<l)
               A(jj,k,l)=NaN;
           end
       end
   end
end

这可能会更慢,但不需要任何额外的内存。

您可以使用 bsxfun 高效地完成它:

J = (1:size(A,1)).';
K = 1:size(A,2);
L = reshape(1:size(A,3),1,1,[]);
A(bsxfun(@or,bsxfun(@lt,J,K),bsxfun(@lt,J,L))) = NaN;

在 MATLAB r2016b 或 Octave 中你可以简单地写:

J = (1:size(A,1)).';
K = 1:size(A,2);
L = reshape(1:size(A,3),1,1,[]);
A(J<K|J<L)=NaN;

矩阵测试结果 A = rand(500,400,300):

 ________________________________
| METHOD   | MEMORY   | SPEED    |
|==========|==========|==========|
| MESHGRID | 1547 MB  | 1.24 Secs|
|----------|----------|----------|
| BSXFUN   | 57 MB    | 0.18 Secs|
|__________|__________|__________|