第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