我有一个函数,它在一个具有重复数字的数组中找到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
我非常感谢您在解决这个问题时能给我的任何帮助吗?
答案 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