MATLAB Answers

0

randomly divide vector into 2 parts.

Asked by RUCHI CHOUDHARY on 15 Sep 2019
Latest activity Edited by Bruno Luong
on 15 Sep 2019
i have vector 100000*1 .i want to randomly divide data of it into 80% and 20% and store them into 2 vector.Divide of data must be random.
"non_zero_entry" is total how many entry in the vector.i tried to do this but it show me error "Index exceeds the number of array elements (80000)".
training_data=.8;
tf = false(length(non_zero_entry),1);
tf(1:round(training_data*non_zero_entry)) = true;
tf = tf(randperm(non_zero_entry)); % error occur in this line "Index exceeds the number of array elements (80000)".
dataTraining = index_rating(tf,:);
dataTesting = index_rating(~tf,:);
Thanks in advance for your help.

  0 Comments

Sign in to comment.

3 Answers

Rik 님의 답변 15 Sep 2019
 채택된 답변

I don't fully understand every step of your code, so I rewrote it:
index_rating=rand(100000,5);%generate example data
training_data=.8;
s=rand(size(index_rating,1),1);
sorted=sort(s);
cutoff=sorted(round(training_data*numel(s)));
tf=s<=cutoff;
dataTraining = index_rating(tf,:);
dataTesting = index_rating(~tf,:);

  0 Comments

Sign in to comment.


Bruno Luong 님의 답변 15 Sep 2019
Bruno Luong 님이 편집함. 15 Sep 2019

For the record, here is how I would do:
n = size(index_rating,1);
i = randperm(n,round(training_data*n));
dataTraining = index_rating(i,:);
dataTesting = index_rating(setdiff(1:n,i),:);

  0 Comments

Sign in to comment.


Bruno Luong 님의 답변 15 Sep 2019
Bruno Luong 님이 편집함. 15 Sep 2019

Always post complete code that can run. don't less us geuss what is the size/class of the inputs
First assumption: non_zero_entry is a integer scalar, then change the allocation to
tf = false(non_zero_entry,1);
Second assumption non_zero_entry is a vector then change
tf = tf(randperm(non_zero_entry));
to
tf = tf(randperm(end))
Similarly correction must be applied for the earlier instruction
tf(1:round(training_data*end)) = true

  0 Comments

Sign in to comment.