/ / Função - matriz com colunas de soma de linhas de soma igual - r, função, matriz

Função - matriz com colunas de soma de linhas de soma igual - r, função, matriz

Eu tenho que criar uma função que cria um "n" por "n" matriz com números naturais e soma de colunas e linhas devem ser iguais. Função f(n, s) deve ter 2 argumentos:

  • n - dimension
  • s - soma

Eu tenho uma solução parcial para este problema:

n<-3
s<-20
m<-matrix(rep(0,n^2),n)

for (c in 1:n){
for (r in 1:n){
if (r==n) m[r,c]<-s-sum(m[1:r-1,c])
else{
m[r,c]<-round(runif(1,1,s-(n-1)-sum(m[1:r,c])))
print (sum(m[1:r,c]))
}
}
}

m

Soma é apenas igual para coluna. Preciso de ajuda para melhorar meu código. Eu ficaria muito grato pela sua ajuda!

Respostas:

0 para resposta № 1

Supondo que você queira alguma aleatoriedade em sua construção, em vez de apenas uma matriz diagonal, uma abordagem seria:

  1. Inicializar matriz com os menores valores possíveis (estou assumindo que os números naturais começam em 1, outros os definem como começando em zero)
  2. Identificar linhas e colunas que são menores que a soma desejada
  3. Selecione uma das entradas neste subconjunto e incremente-a
  4. Siga as etapas 2 e 3. até que nenhuma outra linha e coluna seja menor que a soma desejada.

Você poderia implementar isso em R como:

n<-3
s<-20

d <- matrix(1, n, n) #or 0 if you prefer

while (sum(d)<s*n) {
rows <- which(colSums(d)<s)
cols <- which(rowSums(d)<s)
r <- sample(rows,1)
c <- sample(cols,1)
d[r,c] <- d[r,c] + 1
}

0 para resposta № 2

Isso pode ajudar você. Considerando números naturais a partir de 1 e você não precisa de zeros em sua matriz e s> n. Este código varrerá a matriz gerando números aleatórios para a linha inteira (linha i) e coluna inteira (com coluna) na iteração única de i. Experimente por qualquer valor de n e s condição (s> n)

n<-3
s<-20
m<-matrix(0,nrow=n, ncol=n)
for(i in 1:n){
for(k in i:n){
if(k==i){
if(k==n){       #diagonal and last element of matrix
m[i,k]<-s-sum(m[k, 1:k])
}
else{           #diagonal element
m[i, k]<-round(runif(1,1, s-max(sum(m[k, 1:k]),sum(m[1:k, k]))-(n-k)))
}
}
else{
if(k==n){
m[k, i]<-s-sum(m[1:k, i]) #NOT diagonal but nth element. i.e row=n
m[i, k]<-s-sum(m[i, 1:k]) #NOT diagonal but nth element. i.e col=n
}
else{           #any other element in matrix
m[k, i]<-round(runif(1,1, s-max(sum(m[k, 1:i]),sum(m[1:k, i]))-(n-k)))  #i = col
m[i, k]<-round(runif(1,1, s-max(sum(m[i, 1:k]),sum(m[1:i, k]))-(n-k)))  #i = row
}
}
}
}
m