我有一个名为rf_rate
的矩阵。有些行是NaN
。我希望用rf_rate matrix
的某一行替换这些NaN。到目前为止,我有下面的代码没有给我正确的答案。
miss_rf = isnan(rf_rate); % getting a logical matrix of where NaN's are
% this us_rf is a row from the rf_rate matrix (us_pos is a single number)
us_rf = repmat(rf_rate(us_pos, :), length(rf_rate(:, 1)), 1);
% this is where its going wrong
rf_rate(miss_rf==1, :) = us_rf(miss_rf(miss_rf==1), :);
我的矩阵大小为56x11,但在最后一行之后它变为611x11,为什么?
在我的矩阵rf_rate
中有两行NaN
我想要替换这两行。
答案 0 :(得分:1)
如果您只有NaN
个值的整行,并且'清除'其他地方的行:
% Number of rows to replace :
Nrows=sum(all(isnan(rf_rate),2));
% Replace the rows if Nrows>0:
if Nrows>0
rf_rate(all(isnan(rf_rate),2),:)=repmat(rf_rate(us_pos,:),Nrows,1);
end
如果您有一行参考而且您想要,每次NaN出现在任何其他行中时,要将其替换为您的参考行中的相应值:
% Create a column vector of length `numel(rf_rate)` by repeating the first row :
Corrector=reshape(repmat(rf_rate(us_pos,:),size(rf_rate,1),1),[],1);
% Use linear indexing to fetch the NaN locations and replace them :
rf_rate(isnan(rf_rate(:)))=Corrector(isnan(rf_rate(:)));
rf_rate=magic(10);
rf_rate([2 3 7],:)=NaN;
us_pos=1;
rf_rate =
92 99 1 8 15 67 74 51 58 40
NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
85 87 19 21 3 60 62 69 71 28
86 93 25 2 9 61 68 75 52 34
17 24 76 83 90 42 49 26 33 65
NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
79 6 13 95 97 29 31 38 45 72
10 12 94 96 78 35 37 44 46 53
11 18 100 77 84 36 43 50 27 59
% Apply code 1 :
% Number of rows to replace :
Nrows=sum(all(isnan(rf_rate),2));
% Replace the rows if Nrows>0:
if Nrows>0
rf_rate(all(isnan(rf_rate),2),:)=repmat(rf_rate(us_pos,:),Nrows,1);
end
<强>输出强>
rf_rate =
92 99 1 8 15 67 74 51 58 40
92 99 1 8 15 67 74 51 58 40
92 99 1 8 15 67 74 51 58 40
85 87 19 21 3 60 62 69 71 28
86 93 25 2 9 61 68 75 52 34
17 24 76 83 90 42 49 26 33 65
92 99 1 8 15 67 74 51 58 40
79 6 13 95 97 29 31 38 45 72
10 12 94 96 78 35 37 44 46 53
11 18 100 77 84 36 43 50 27 59
rf_rate=magic(10);
us_pos=1;
NanPos=randi(numel(rf_rate),10,1);
NanPos(mod(NanPos,10)==1)=[];
rf_rate(NanPos)=NaN;
rf_rate =
92 99 1 8 15 67 74 51 58 40
98 80 7 14 16 73 55 57 64 41
4 NaN 88 20 22 54 56 NaN 70 NaN
85 87 19 21 3 60 62 69 71 28
86 93 25 2 9 61 68 75 52 34
17 24 76 83 90 42 49 26 33 65
23 5 82 89 91 48 30 32 39 66
79 6 13 95 97 29 31 38 45 72
NaN 12 94 NaN NaN 35 37 44 NaN 53
11 18 NaN 77 84 36 NaN 50 27 59
% Apply code 2 :
% Create a column vector of length `numel(rf_rate)` by repeating the first row :
Corrector=reshape(repmat(rf_rate(us_pos,:),size(rf_rate,1),1),[],1);
% Use linear indexing to fetch the NaN locations and replace them :
rf_rate(isnan(rf_rate(:)))=Corrector(isnan(rf_rate(:)));
输出
rf_rate =
92 99 1 8 15 67 74 51 58 40
98 80 7 14 16 73 55 57 64 41
4 99 88 20 22 54 56 51 70 40
85 87 19 21 3 60 62 69 71 28
86 93 25 2 9 61 68 75 52 34
17 24 76 83 90 42 49 26 33 65
23 5 82 89 91 48 30 32 39 66
79 6 13 95 97 29 31 38 45 72
92 12 94 8 15 35 37 44 58 53
11 18 1 77 84 36 74 50 27 59
请注意,该代码的第二个版本适用于机器人案例。
答案 1 :(得分:0)
我还没弄清楚你的代码到底发生了什么,但是根据你的描述,我认为你想要的是
rf_rate(isnan(rf_rate)) = rf_rate(us_pos,:);
请注意,与您编写的内容不同,us_rf
不是一行,而是重复行的矩阵。你的代码正在接受并多次插入。
另请注意,这不是特别强大,如果您的个人NaN
没有占用整行,则会失败。