clc
clear all
q=[2 31 6;2 31 7;2 31 6;2 31 6;2 31 6;2 31 6];
for i=1:6
if i>1
for j=1:i-1
if q(j,2)==q(i,2)
e = rand(10,1); % some matrix you want to sample from
idx5=randi(length(e)); % random index into x
q(j,2)=idx5
j=1;
end
end
end
end
我有矩阵q,我想更改每行中第二列的值,如果下一个值表示下一行中的值与前一行中的值相同ex:第1行该值在第二列是31行2,第二列中的值是31
所以我想在值改变时通过这个随机函数将第二个值31变成一个值,代码假设从所有先前的值开始再次开始检查,因为可能新的随机值再次匹配其中一个以前的值
代码中的问题是它离开循环是j = 1:i-1当我再次使j = 1时因为我必须从头开始再次检查所有值
我通过跟踪检查它是否离开循环并且它是从循环开始i = 1:6但是它假设保持在第二个循环中,这是针对j = 1:i-1直到没有先前的随机值匹配
所以每当值在矩阵中匹配时我想让j = 1,这意味着从头开始再次启动循环
答案 0 :(得分:1)
如果我理解正确的问题,这应该有效:
rand_matrix = [zeros(10,1); rand(10, 1)]; % half of it zeros
ids = find(diff(q(:, 2)) == 0) + 1;
index = ceil(rand(1, length(ids)) * length(rand_matrix)); % randi is better, but i dont remember the correct syntax to get a vector with given max value
q(ids, 2) = rand_matrix(index);
根据您的样本数据,我得到(我将rand_matrix乘以40,得到相同范围内的数字):
q =
2.00000 31.00000 6.00000
2.00000 14.43287 7.00000
2.00000 5.46286 6.00000
2.00000 15.44111 6.00000
2.00000 0.00000 6.00000
2.00000 0.00000 6.00000
你可以这样做:
it = 0; % Counter to avoid looping to inf
while length(unique(q(:,2))) ~= length(q(:,2)) && it < 40
% Fill in the blanks
%
%
end
答案 1 :(得分:0)
我真的不明白你的问题描述,因此我仔细研究了你的代码。
行j=1
没用。 for循环覆盖迭代器。查看这个简单的例子来理解:
for idx=1:10
disp(idx)
idx=1;
end
另一个不产生任何输出的代码块是:
randomval = e(idx5);
if randi(2)-1 % half the time assign to zero
randomval = 0;
end
randomval
从未使用过。
答案 2 :(得分:0)
这是一个带递归函数的解决方案。我只用您给出的q
示例尝试过。如果有些情况不起作用,请告诉我。
function [qMatrix] = testRecur(rowIndex, qMatrix)
% For your example I called the function as follow:
% qMatrix = testRecur(1, [2 31 6;2 31 7;2 31 6;2 31 6;2 31 6;2 31 6])
for ii=rowIndex:(size(qMatrix,1) - 1)
if qMatrix(ii, 2) == qMatrix(ii+1, 2)
e = rand(10, 1);
idx5 = randi(length(e));
qMatrix(ii+1, 2) = idx5;
break
end
end
if exist('e','var')
[qMatrix] = testRecur(ii, qMatrix);
end
end
使用ii and jj是一个很好的实践。
答案 3 :(得分:0)
for i=1:6
if i>1
j=0;
while j<i-1
j=j+1;
if q(j,2)==q(i,2)
e = rand(5,1); % some matrix you want to sample from
idx5=randi(length(e)); % random index into
q(i,2)=idx5
j=1;
end
end
end
end