用NaN替换矩阵每行中的重复值



我正试图创建一个函数,用NaN替换矩阵每行中重复的值。我的代码可以工作,只是我似乎无法将其应用于每一行。它将代码应用于每一行,但只接受";n〃;列的数量,而不是行的数量,所以如果行比列多,那么它不会处理每一行。例如,如果我有8行6列,它只允许我为n输入6,而不是8。然而,它将代码应用于行,但仅应用于前6行。下面是一个工作示例:

X = [1 2 3 4 4 4; 1 2 3 4 5 5; 1 2 2 2 2 2; 1 2 3 3 3 3; 
1 1 1 1 1 1; 1 2 3 4 4 4; 1 2 3 3 3 3; 1 2 2 2 2 2];
n=6
nanfill = nan(1,n);
for i=1:n
temp = [unique(X(i,:)), nanfill];
X(i,:) = temp(1:n);
end

它为我的原始矩阵提供了这个:

1 2 3 4 4 4
1 2 3 4 5 5
1 2 2 2 2 2
1 2 3 3 3 3
1 1 1 1 1 1
1 2 3 4 4 4
1 2 3 3 3 3
1 2 2 2 2 2

这是我运行代码后得到的新矩阵的输出:

1   2   3   NaN NaN NaN
1   2   3   4   NaN NaN
1   2   NaN NaN NaN NaN
1   2   3   NaN NaN NaN
1   NaN NaN NaN NaN NaN
1   2   3   4   NaN NaN
1   2   3   3   3   3
1   2   2   2   2   2

如果我试图将行数8放入"0";n〃;然后它给我以下错误:

Unable to perform assignment because the size of the left side is 1-by-6 and the size
of the right side is 1-by-8.

如果每行中的值总是不递减的,如您的示例所示,您可以使用以下内容。它计算每个条目与其左边的条目之间的差值,如果差值为零,则写入NaN

X([false(size(x,1),1) ~diff(X,[],2)]) = NaN;

这是因为矩阵的行中有元素。不能将8个元素长的矢量指定为较短的矢量。最好检查行的长度,这样它们肯定会匹配:

X = [1 2 3 4 4 4; 1 2 3 4 5 5; 1 2 2 2 2 2; 1 2 3 3 3 3; 
1 1 1 1 1 1; 1 2 3 4 4 4; 1 2 3 3 3 3; 1 2 2 2 2 2];
n=size(X,2) % <- # of columns (length of one row)
nanfill = nan(1,n);
for i=1:n
temp = [unique(X(i,:)), nanfill];
X(i,:) = temp(1:n);
end

相关内容

  • 没有找到相关文章

最新更新