[R] loop not working my way

Rui Barradas ruipbarradas at sapo.pt
Sat Oct 19 23:03:08 CEST 2013


Hello,

Seems simple.


fun <- function(n = 10){
	matd <- matrix(sample(1:30,30, replace=FALSE), ncol=5, nrow=6)
	res <- list(mat = NULL, Design_best = matd, Original_design = matd)
	trace <- sum(diag(matd))
	res$mat <- rbind(res$mat, c(trace = trace, iterations = 0))
	for(i in seq_len(n)){
		matd <- matrix(sample(1:30,30, replace=FALSE), ncol=5, nrow=6)
		if(sum(diag(matd)) < trace){
			trace <- sum(diag(matd))
			res$mat <- rbind(res$mat, c(trace = trace, iterations = i))
			res$Design_best <- matd
		}
	}
	res
}

fun()
fun(20)


Hope this helps,

Rui Barradas

Em 19-10-2013 18:41, laz escreveu:
> Dear R users,
>
> Suppose I want to randomly generate some data, in matrix form, randomly
> swap some of the elements and calculate trace of the matrix for each of
> these stages. If the value of trace obtained in the later is bigger than
> the former, drop the latter matrix and go back to the former matrix,
> swap some elements of the matrix again and calculate the trace. If the
> recent trace is smaller than the previous one, accept the matrix as the
> current .  Use the current matrix  and swap elements again. repeat the
> whole process for a number of times, say, 10. The output from the
> function should display only the original matrix and its value of trace,
> trace values of successful swaps and their iteration counts and the
> final best matrix that had the smallest value of trace, together with
> its trace value.
>
> For example
> ## original
>  > matd<-matrix(sample(1:30,30,replace=FALSE),ncol=5,nrow=6,byrow=FALSE)
>  > matd
>       [,1] [,2] [,3] [,4] [,5]
> [1,]   12   27   29   16   19
> [2,]   25   10    7   22   13
> [3,]   14   23    3   11   21
> [4,]   28    6    5    2   18
> [5,]   24   20    1   17   26
> [6,]    9    4   30    8   15
>  > trace<-sum(diag(matd))
>  > trace
> [1] 53
>
> #  1st iteration
>
>       [,1] [,2] [,3] [,4] [,5]
> [1,]   24   29   20   25   17
> [2,]   16    1   30    9    5
> [3,]   18   22    2   10   26
> [4,]   23   27   19   21   28
> [5,]   15    6    8    3   13
> [6,]   12   14    7   11    4
>  > trace<-sum(diag(matd))
>  > trace
> [1] 61
>
> ## drop this matrix because 61 >  53
>
> #  2nd iteration
>  > matd<-matrix(sample(1:30,30,replace=FALSE),ncol=5,nrow=6,byrow=FALSE)
>  > matd
>       [,1] [,2] [,3] [,4] [,5]
> [1,]    2   28   23   15   14
> [2,]   27    9   10   29    7
> [3,]    5   18   12    1   11
> [4,]    8    4   30   16   24
> [5,]   25   19   26    6   13
> [6,]   17   22    3   20   21
>  > trace<-sum(diag(matd))
>  > trace
> [1] 52
>
> ## accept this matrix because 52 < 53
>
> ### 3rd iteration
>  > matd<-matrix(sample(1:30,30,replace=FALSE),ncol=5,nrow=6,byrow=FALSE)
>  > matd
>       [,1] [,2] [,3] [,4] [,5]
> [1,]    1   29   17    8    6
> [2,]   21   23   10    7   14
> [3,]   22    4   12   26    9
> [4,]    3   13   11   30   15
> [5,]    5   24   18   16    2
> [6,]   20   25   19   27   28
>  > trace<-sum(diag(matd))
>  > trace
> [1] 68
>
> ## drop this matrix because 68 > 52
>
> ##  4th  iteration
>  > matd<-matrix(sample(1:30,30,replace=FALSE),ncol=5,nrow=6,byrow=FALSE)
>  > matd
>       [,1] [,2] [,3] [,4] [,5]
> [1,]    2    6    5   28   15
> [2,]    9   12   13   19   24
> [3,]    3   22   14   11   29
> [4,]   30   20   17    7   23
> [5,]   18   27   21    1   10
> [6,]   25   16    4    8   26
>  > trace<-sum(diag(matd))
>  > trace
> [1] 45
>
> ## accept this matrix because 45 < 52
>
> The final results will be:
> $mat
>          trace    iterations
> [1,]       53        0
> [2,]       52        2
> [3,]       45        4
>
> $ Design_best
>
>    [,1] [,2] [,3] [,4] [,5]
> [1,]    2    6    5   28   15
> [2,]    9   12   13   19   24
> [3,]    3   22   14   11   29
> [4,]   30   20   17    7   23
> [5,]   18   27   21    1   10
> [6,]   25   16    4    8   26
>
> $ Original_design
>
>    [,1] [,2] [,3] [,4] [,5]
> [1,]   12   27   29   16   19
> [2,]   25   10    7   22   13
> [3,]   14   23    3   11   21
> [4,]   28    6    5    2   18
> [5,]   24   20    1   17   26
> [6,]    9    4   30    8   15
>
> Regards,
> Laz
>
> ______________________________________________
> R-help at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-help
> PLEASE do read the posting guide
> http://www.R-project.org/posting-guide.html
> and provide commented, minimal, self-contained, reproducible code.



More information about the R-help mailing list