不同的独特行

时间:2015-01-10 07:47:34

标签: matlab row

我有一个函数,它在一个具有重复数字的数组中找到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]

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

例如,输出可以如下:

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

我非常感谢您在解决这个问题时能给我的任何帮助吗?

1 个答案:

答案 0 :(得分:1)

在函数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  

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

创建一个唯一的随机序列
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