2013-12-12 52 views
1
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,我想改變每行中的第二列中的值,如果下一個值,這意味着下一行中的值是相同的在前一行中的值例如:第1行第2列中的值爲第31行第2列中的值爲31置換矩陣值,而無需通過隨機函數重複

所以我想通過此隨機函數將第二個值31更改爲值當值改變時,代碼假設從以前的所有值開始再次檢查,因爲可能新的隨機值再次匹配以前的值之一

問題代碼中,它是離開循環是j = 1:i-1當我再次j = 1時,因爲我必須再次開始檢查所有的值從開始

我通過跟蹤檢查它是離開循環,它是從循環開始i = 1:6,但它是假設留在第二個循環,這是爲j = 1:i-1,直到沒有以前的隨機值匹配

所以我想使J = 1個時的值在矩陣,這意味着從一開始就重新開始循環匹配

回答

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); 

與樣品的數據,我得到(我乘以40的rand_matrix,在同一範圍內獲得數):

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 
+0

似乎沒有必要作出它的一半是爲零,但值必須是確切的數字,每當值是匹配,循環必須在對於j再次啓動= 1:I-1 –

+0

什麼你的意思是?哪些值必須是精確的數字?爲什麼循環必須重新開始?產生的「q」不是你想要達到的目標?如果是這樣,什麼是錯的?爲什麼需要使用循環? –

+0

我想改變在列2中的矩陣q的值,所以如果你看到我的原始矩陣,那麼這些值與前面的原始矩陣不同,因爲第2列中的所有值都是31​​,所以我的代碼假設要更改值31是在第二次生到最後的隨機變量,但即使我不想隨機變量也被重複多數民衆贊成爲什麼我必須再次啓動循環 –

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從未使用過。

+0

是的,你是對的不需要randmoval,但問題是如何使循環每當值的匹配,從而確保沒有值再次重複,這意味着在從起點開始你的情況,因爲你解釋j = 1必須被認爲是沒用的 –

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

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 
+0

我解決了使用此代碼 –