我正在寻找一种解决方案,将不同数量的NaN插入矩阵的第一行。假设我有一个20x3的双矩阵和一个叫做numNaNs
的1x3双行向量。行向量包含我想要插入矩阵的NaN数。
例如,我们假设numNaNs = [3, 5, 7]
。代码看起来像是用NaN替换矩阵中第1列的前3行,矩阵中第2列的前5行,以及矩阵中第3列的前7行?
我试过这样的事情:
mat(1:numNaNs, :) = nan;
但是,这只会用NaN替换所有列中的前3行。
答案 0 :(得分:3)
简短版本是使用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;
答案 1 :(得分: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
答案 2 :(得分:2)
@ nilZ0r的解决方案很棒,但是让我向前迈出一步,因为R2016b有隐式扩展并且不需要bsxfun:
.git/config
答案 3 :(得分:0)
您可以使用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