我正试图创建一个函数,用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