Matrix
Question I
Assume that n is an integer greater than 1. Consider the slash(n) function whose output is a nxn symmetric matrix with elements are integers 1 on the diagonal, 2 on top and below the diagonal and so on.
For example:
bslash(4)
[,1] [,2] [,3] [,4]
[1,] 1 2 3 4
[2,] 2 1 2 3
[3,] 3 2 1 2
[4,] 4 3 2 1
Write the above function without using loop, name it as bslash.v2(). Hint: you can write a demo as using loop.
Solution I:
bslash.v2 <- function(n) {
#generate matrix so as to determine memory space
upper <- matrix(1,nrow = n,ncol = n)
lower <- matrix(-1,nrow=n,ncol=n)
#combine upper and lower matrix
m1 <- upper*upper.tri(upper, diag = F)+lower*lower.tri(lower,diag = T)
#cumsum to make sure each row in m3 can be reduced first then increase
m2 <- t(apply(t(m1),2,cumsum)) #t() is to properly cumsum m1 by rows
m3 <- matrix(1,nrow=n,ncol=n)
#make sure m3 is started from 2 instead of 1
m3 <- 1+apply(m3,2,cumsum)
#print result
m3+m2
}
Solution II:
bslash.v2<-function(n) { # assume n is integer >1
d1<-matrix(1:n^2,nrow=n,byrow=T) # nxn matrix 1 to n^2
d2<-matrix(n^2:1,nrow=n,byrow=T) # nxn matrix n^2 to 1
x1<-matrix(rep(1:n,n),nrow=n,byrow=T) # nxn matrix, each row is 1:n
x2<-matrix(rep(1:n,n),nrow=n) # nxn matrix, each col is 1:n
(d1%%(n+1))*(x1>=x2)+(d2%%(n+1))*(x1<x2) # output
}
Question 2
Given seed(2019) and d<-matrix(sample(1:30,replace=F), nrow=5, byrow=T)
, find index of maximum number in d.
Solution:
z <- (d==30)+0
i <- sum((1:nrow(z))*apply(z, 1, sum))
j <- sum((1:ncol(z))*apply(z, 2, sum))
c(i,j)
Question 3
Given a matrix, write a function without loop to replace upper triangular entries in the matrix with 0.
Solution
q <- function(M){
n <- nrow(M)
x1 <- matrix(rep(1:n,n), nrow=n, byrow=T)
x2 <- matrix(rep(1:n,n), nrow=n)
M*(x1<=x2)