替换矩阵中的值而不重复随机函数

时间:2013-12-12 21:38:54

标签: matlab

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,这意味着从头开始再次启动循环

4 个答案:

答案 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