MATLAB:在矩阵中插入不同数量的 NaN

Posted

技术标签:

【中文标题】MATLAB:在矩阵中插入不同数量的 NaN【英文标题】:MATLAB: Inserting different number of NaNs in matrix 【发布时间】:2016-11-29 12:57:33 【问题描述】:

我正在寻找一种解决方案,将不同数量的 NaN 插入矩阵的第一行。假设我有一个 20x3 双矩阵和一个名为 numNaNs 的 1x3 双行向量。行向量包含我想插入到矩阵中的 NaN 数量。

例如,假设numNaNs = [3, 5, 7]。用 NaN 替换矩阵中第 1 列的前 3 行、矩阵中第 2 列的前 5 行和矩阵中第 3 列的前 7 行的代码会是什么样子?

我尝试过这样的事情:

mat(1:numNaNs, :) = nan;

但是,这只会用 NaN 替换所有列中的前 3 行。

【问题讨论】:

【参考方案1】:

一个简短的版本是使用 bsxfun 和内置函数 le(小于或等于)

% Create test data
A = rand(20,3);
numNaNs = [3, 7, 5];

% Number of rows (to keep the last line cleaner)
N = size(A,1);

% Replace with NaN
A(bsxfun(@le, (1:N)', numNaNs)) = NaN;

【讨论】:

nilZ0r 和 Paul 解决方案都有效。但是,我了解到@Some Guy 的 for-loop 解决方案似乎是执行速度最快的。所以我可能会选择那个。【参考方案2】:

最直接的解决方案是遍历矩阵的列,并根据 numNaNs 向量中的适当值填充 NaN。

M = rand(20, 3);
numNaNs = [3 5 7];
% for each column of numNaNs
for i=1:size(numNaNs,2)
    % set the first numNaNs(i) elements of the ith column to NaN
    M(1:numNaNs(i),i) = NaN;
end

【讨论】:

是的,你是对的,这将是一个解决方案。但是,我实际上是在寻找一行代码并避免使用 for 循环。我只是好奇在那种特定情况下这是否可能? @Andi 从技术上讲,它可以在一行中完成(参见@nilZ0r),但在很大程度上模糊了代码的意图。不幸的是,MATLAB 没有一种很好的方法来以您想要的方式索引到矩阵中。 @Andy Campbell 的 R2016b 解决方案看起来更整洁,但仍然需要读者解码它在做什么,并且可能不值得保存 1 或 2 行。各有千秋!【参考方案3】:

@nilZ0r 的解决方案非常棒,但让我更进一步,因为 R2016b 具有隐式扩展并且不需要 bsxfun:

A = rand(20,3);
numNaNs = [3, 7, 5];

% Number of rows 
N = size(A,1);

% Replace with NaN
A((1:N)' <= numNaNs) = NaN

A =

       NaN       NaN       NaN
       NaN       NaN       NaN
       NaN       NaN       NaN
    0.1890       NaN       NaN
    0.6868       NaN       NaN
    0.1835       NaN    0.9797
    0.3685       NaN    0.4389
    0.6256    0.5502    0.1111
    0.7802    0.6225    0.2581
    0.0811    0.5870    0.4087
    0.9294    0.2077    0.5949
    0.7757    0.3012    0.2622
    0.4868    0.4709    0.6028
    0.4359    0.2305    0.7112
    0.4468    0.8443    0.2217
    0.3063    0.1948    0.1174
    0.5085    0.2259    0.2967
    0.5108    0.1707    0.3188
    0.8176    0.2277    0.4242
    0.7948    0.4357    0.5079

【讨论】:

【参考方案4】:

您可以使用bsxfun 和函数句柄来做到这一点:

mat = rand(20,3); % Sample matrix to transform
numNaNs = randi(20,1,3); % Sample index matrix
numNaNs =

    18    14    14

mat_new = bsxfun(@(x,y)[NaN(y,1); x(y+1:end)],mat,numNaNs)

mat_new =

       NaN       NaN       NaN
       NaN       NaN       NaN
       NaN       NaN       NaN
       NaN       NaN       NaN
       NaN       NaN       NaN
       NaN       NaN       NaN
       NaN       NaN       NaN
       NaN       NaN       NaN
       NaN       NaN       NaN
       NaN       NaN       NaN
       NaN       NaN       NaN
       NaN       NaN       NaN
       NaN       NaN       NaN
       NaN       NaN       NaN
       NaN    0.0518    0.6663
       NaN    0.0801    0.8035
       NaN    0.0925    0.1394
       NaN    0.4901    0.0614
    0.9647    0.9760    0.1103
    0.7940    0.9753    0.9475

【讨论】:

以上是关于MATLAB:在矩阵中插入不同数量的 NaN的主要内容,如果未能解决你的问题,请参考以下文章

matlab中的元胞数组如何实现批量的赋值呢?

在Matlab中用NaN取矩阵的平均值[重复]

Matlab忽略矩阵中的NaN

matlab怎么把元素替换成NAN

matlab有多少api函数

用 NaN 替换矩阵的某些元素(MATLAB)