r语言编程艺术中第三章扩展案例中找图中距离最近的一对端点的代码中17

Python010

r语言编程艺术中第三章扩展案例中找图中距离最近的一对端点的代码中17,第1张

扩展案例4,找到图中距离最近的一对端点:

第i行第j列表示城市i和城市j的距离,x[i,j]=x[j,i]

矩阵式对称的,且我们的目标使找到非0的最小值,并返回其所有的位置。

既然是对称的,只需要计算上三角(此例用上三角)或下三角的每一行的最小值,再找到这些最小值的那一个。

q<-matrix(c(0,12,13,8,20,12,0,15,28,88,13,15,0,6,9,8,28,6,0,33,20,88,9,33,0),

nrow=5,ncol=5)

mind<-function(d){

n<-nrow(d)

dd<-cbind(d,1:n)#为原矩阵增加一列,为相应的行号

wins<-apply(dd[-n,],1,imin)#dd[-n,],因为无需计算最后一行的最小值,上三角中值为0

i<-which.min(wins[2,])

#wins第1行为每行上三角最小值的列号,第2行为每行上三角的最小值

#在wins矩阵第2列找出最小值的位置,即为该最小值在原矩阵中的行号

j<-wins[1,i]

#j为wins矩阵中最小的值对应的k

#j为原矩阵的列号

return(c(d[i,j],i,j))

}

imin<-function(x){

lx<-length(x)

i<-x[lx]#注意此处返回的是行号,每一行的最后一个数字为对应的行号

j<-which.min(x[(i+1):(lx-1)])

#lx-1是为了不将行号值纳入计算,(i+1):(lx-1)为对应行i的上三角位置

#j取了该行上三角中最小值的位置

#举例,q第一行(i=1)的上三角值为12,13,8,20.那么最小值为8,j=3,k=i+j=4,为原矩阵中该行最小值的实际位置

k<-i+j

return(c(k,x[k]))

}

#imin主要应用在apply中,要考虑到其应用的是一个什么样子的矩阵

mind(q)

#[1] 6 3 4,最小的值是6,位于第3行第4列

r=randi([iMin,iMax],m,n)在开区间(iMin,iMax)生成mXn型随机矩阵matlab中生成随机数主要有三个函数:rand,randn,randi1,rand生成均匀分布的伪随机数。分布在(0~1)之间主要语法:rand(m,n)生成m行n列的均匀分布的伪随机数rand(m,n,'double')生成指定精度的均匀分布的伪随机数,参数还可以是'single'rand(RandStream,m,n)利用指定的RandStream(我理解为随机种子)生成伪随机数2,randn生成标准正态分布的伪随机数(均值为0,方差为1)主要语法:和上面一样3,randi生成均匀分布的伪随机整数主要语法:randi(iMax)在开区间(0,iMax)生成均匀分布的伪随机整数randi(iMax,m,n)在开区间(0,iMax)生成mXn型随机矩阵r=randi([iMin,iMax],m,n)在开区间(iMin,iMax)生成mXn型随机矩阵

1.转换大小写字母,用LCase和UCase这两个函数随便写一下就行,

2.辗转相减法 ,你可以用两个inputbox 输入,然后代码如下

function gcd%(byval m%, byval n%)

if m<n then t=m:m=n:n=t

r=m mod n

do while(r<>0)

m=n:n=r:r=m mod n

loop

gcd = n

end function

3,可以随机产生十个数,也可以自己写进去,自己写进去可以用文本框,从而形成一个数组部分代码如下

,从形成数组后开始

n=ubound(a)

for i = 0 to n-1

imin = i

for j = i+1 to n

if a(j)<a(imin) then imin = j

next j

t = a(i) :a(i)= a(imin):a(imin) = t

next i

for i = lbound(a) to ubound(a)

?a(i)

next

end