不同的唯一行

Different unique rows

我有一个函数可以在数组中找到具有重复数字的 ROWS 并将它们替换为唯一的行。 这是函数:

NVAR=唯一行中的参数数量

PVBu= 行中数字的上限

下限默认为 1

function [A]=nonrepeatuniquerow(A,NVAR,PVBu)
HM = zeros(1,NVAR);
p = zeros(1,PVBu);
 for j = 1
 p(1:PVBu) = 1:PVBu;
 for k = PVBu:-1:PVBu-NVAR+1
 q = ceil(k*rand);
 HM(j,PVBu-k+1) = p(q);
 p(q:k-1) = p(q+1:k);
 end
 end
b = any(~diff(sort(A,2),1,2),2) | any(A==0,2);

A(b,:) = repmat(HM,sum(b),1);
end

例如,

假设 [9 1 7] 是随机生成的唯一行。

矩阵A传递给函数'nonrepeatuniquerow'.

A= [2 3 3
    2 5 2
    1 5 9
    9 7 6]

输出为:

A= [9 1 7
    9 1 7
    1 5 9
    9 7 6]

我的问题是如何修改该函数,以便它用不同的唯一行替换具有重复编号的行?

例如输出可能如下:

A= [7 2 3
    2 1 8
    1 5 9
    9 7 6]

下面的函数每次调用时只生成唯一的行。

NVAR=唯一行中的参数数量

PVBu= 行中数字的上限

下限默认为 1

function [HM]=generateunique(NVAR,PVBu)

HM = zeros(1,NVAR);
p = zeros(1,PVBu);
 for j = 1
 p(1:PVBu) = 1:PVBu;
 for k = PVBu:-1:PVBu-NVAR+1
 q = ceil(k*rand);
 HM(j,PVBu-k+1) = p(q);
 p(q:k-1) = p(q+1:k);
 end
 end
end

如果你能在解决这个问题上给我任何帮助,我将不胜感激?

在函数nonrepeatuniquerow中,第一部分只是为了创建随机序列HM。您可以 运行 遍历 for 循环中的所有非唯一行,并为每个行创建一个单独的 HM。看起来像这样:

function [A]=nonrepeatuniquerow(A,NVAR,PVBu)

b = any(~diff(sort(A,2),1,2),2) | any(A==0,2);
for ii=find(b==1).'
    HM = zeros(1,NVAR);
    p = zeros(1,PVBu);
    for j = 1
        p(1:PVBu) = 1:PVBu;
        for k = PVBu:-1:PVBu-NVAR+1
            q = ceil(k*rand);
            HM(j,PVBu-k+1) = p(q);
            p(q:k-1) = p(q+1:k);
        end
    end
    A(ii,:) = HM;
end
end  

您还可以用内置的 randperm 函数替换 generateunique 函数或代码中执行相同操作的部分。您可以通过

创建一个独特的随机序列
HM = randperm(PVBu,NVAR);

这将为您提供以下代码

function A = nonrepeatuniquerow(A,NVAR,PVBu)

b = any(~diff(sort(A,2),1,2),2) | any(A==0,2);
for ii=find(b==1).'
    A(ii,:) = randperm(PVBu,NVAR);
end

end