2016-08-09 10 views
1

次の構造を持つ行列を作成する関数を書いています。注意すべき最も重要なことは、行2ということである - 7は、他のすべての列の副対角と0の値が含まれています。ベクトル値を使用してRの行列の下位対角に新しい行を追加する

0.00 0.00 0.00 0.00 0.00 0.50 0.50 
0.75 0.00 0.00 0.00 0.00 0.00 0.00 
0.00 0.80 0.00 0.00 0.00 0.00 0.00 
0.00 0.00 0.80 0.00 0.00 0.00 0.00 
0.00 0.00 0.00 0.90 0.00 0.00 0.00 
0.00 0.00 0.00 0.00 0.60 0.00 0.00 
0.00 0.00 0.00 0.00 0.00 0.80 0.00 

私の機能の2つの入力、xyがあります。最初の行はxベクトルによって定義されるように:

x <- c(0.00, 0.00, 0.00, 0.00, 0.00, 0.50, 0.50) 

Iは、マトリックスの残りの部分を完了するために、第二のベクターyを使用したいです。 R2 C1の第1の値、R3 C2の第2の値、R4 C3の第3の値などを使用して、行列が完成し、他のすべてを0で満たすまで続きます。私は、これはRで解決することができると確信して

y <- c(0.75, 0.80, 0.80, 0.90, 0.60, 0.80, 0.00) 

は、おそらく、既に使用され得るループは、この構造体または定義する行列関数があります。

私は関数を記述し、行列を作成し、最初の行を追加することができます(下記参照)が、現在のスキルセットを少し超えています。 xとyの値と長さが変わることがあります。

誰からどのような援助やポインタが...

をいただければ幸いです(これは私がこれまでに....私はそれが少し哀れだ知っているものである)

matrix <- function (x, y) { 
    matrix <- x 

    matrix 
} 

答えて

3

ここですべてで試みです一度:

head(rbind(x, diag(y)),-1) 

これは基本的にによって1行それを押し下げ、onal diag上の値とyから正方行列を作成します-ing xを入力し、新しく作成した行列の最後から余分な行を削除します。

rowを使用して創造的なインデックスのビットとcolあまりにもそれを行うことができます。

m <- matrix(0,nrow=7,ncol=7) 
m[row(m)-col(m)==1] <- head(y,-1) 
m[1,] <- x 

はどちらを返す:

#  [,1] [,2] [,3] [,4] [,5] [,6] [,7] 
#[1,] 0.00 0.0 0.0 0.0 0.0 0.5 0.5 
#[2,] 0.75 0.0 0.0 0.0 0.0 0.0 0.0 
#[3,] 0.00 0.8 0.0 0.0 0.0 0.0 0.0 
#[4,] 0.00 0.0 0.8 0.0 0.0 0.0 0.0 
#[5,] 0.00 0.0 0.0 0.9 0.0 0.0 0.0 
#[6,] 0.00 0.0 0.0 0.0 0.6 0.0 0.0 
#[7,] 0.00 0.0 0.0 0.0 0.0 0.8 0.0 
+0

を、私はそれが好き - 非常に賢い、私は1つで全てを取りますよ答えに行く!ご協力いただきありがとうございます。 –

+0

あなたは行の名前を望まないかもしれないので、最初の行に 'unname(x)'と書いてあるかもしれません。 – shayaa

+1

@shayaa - あるいは 'head(rbind(x、diag(y)、deparse.level = 0)、 - 1)'それを制御する正式な議論を使いたいと思っています。 – thelatemail

関連する問題