陣列和矩陣操作

2021-07-06 04:50:24 字數 4563 閱讀 1052

建立陣列和矩陣:

維度向量由dim()指定,例如,z是乙個由1500個元素組成的向量。下面的賦值語句

> dim(z) <- c(3,5,100)#使它具有dim屬性,並且將被當作乙個3x5x100

#的陣列進行處理。 c(3,5,100) 就是他的維度向量。

#還可以用到像matrix()和array()這樣的函式來賦值。比如

> array(1:20, dim=c(4,5))

> matrix(1:24, 3,4)

scale(x,center=true,scale=true)為資料物件 x按列進行中心化(center=true)或標準化( center=true,scale=true):

例子:x <- matrix(rnorm(10), ncol = 2)

(centered.x <- scale(x))

cov(centered.x)

陣列的外積

陣列乙個非常重要的運算就是

外積運算

(outer product

)。如果a和

b是兩個數

值陣列,它們的外積將是這樣的乙個陣列:維度向量通過連線兩個運算元的維度向

量(順序非常的重要

)得到;資料向量則由

a的資料向量元素和

b的資料向量元素的所

有可能乘積得到。外積是通過特別的操作符

%o%實現:

一種備選的方案是,

> ab <- outer(a, b, "*")

例子:

> a<-matrix(c(1:4),2,2)

> a

[,1] [,2]

[1,] 1 3

[2,] 2 4

> b<-matrix(c(1:4),2,2)

> outer(a,b,"*")

, , 1, 1

[,1] [,2]

[1,] 1 3

[2,] 2 4

, , 2, 1

[,1] [,2]

[1,] 2 6

[2,] 4 8

, , 1, 2

[,1] [,2]

[1,] 3 9

[2,] 6 12

, , 2, 2

[,1] [,2]

[1,] 4 12

[2,] 8 16

outer可以用到任何自定義雙變數函式。

例如:

> f <- function(x, y) cos(y)/(1 + x^2)

> z <- outer(x, y, f)

矩陣的*、%*%、%o%的區別

*:兩個矩陣對應位置相乘。

%*%:內積。

%o%:外積。

函式 crossprod()

函式 crossprod()

可以完成\矢積

"(

crossproduct

)運算,也就是說

crossprod(x,y)和

t(x) %*% y

等價,但是在運算上更為高效。

如果 crossprod()

第二個引數忽略

了,它將預設和第乙個引數一樣,即第乙個引數和自己進行運算。

函式aperm(a, perm)

可以用來重排乙個陣列

a例如:

> b <- aperm(a, c(2,3,1))

解釋:a是乙個三維陣列用a[i,j,k]表示,則c(2,3,1)表示交換i,j,k的位置,b就表示三維

陣列a[j,k,i]

t()

此函式用來做矩陣的轉置。用例:

b <- t(a)

diag()

函式diag()

的含義依賴於它的引數。當

v是乙個向量時,

diag(v)

返回以該向

量元素為對角元素的對角矩陣。當

m是乙個矩時,

diag(m)返回m

的對角元素。

這和matlab

中diag()

的用法完全一致。不過有點混亂的是,如果

k是單個值

4 ,那

麼diag(k)

的結果就是k×

k的方陣!

用例:> diag(3)

[,1] [,2] [,3]

[1,] 1 0 0

[2,] 0 1 0

[3,] 0 0 1

> diag(c(1:3))

[,1] [,2] [,3]

[1,] 1 0 0

[2,] 0 2 0

[3,] 0 0 3

> diag(array(1:16,c(4,4)))

[1] 1 6 11 16

矩陣求逆,solve函式

> solve(a,b)

求解線性方程組,並且返回

x (可能會有一些精度丟失)

表示為x

=a ¡1

b,其中

a ¡

1 表示

a 的逆(

inverse

)。矩陣的逆可以用下面的命令計

算,solve(a)

不過一般很少用到。在數學上,用直接求逆的辦法解

x <- solve(a) %*% b

相比solve(a,b)不

僅低效而且還有一種潛在的不穩定性。

用於多元計算的二次型

x 0

a ¡

1 x

可以通過

5 像

x %*% solve(a,x)

的方式計算得到,

而不是直接計算

a的逆。

求矩陣特徵值和特徵向量eigen()函式。

> a

[,1] [,2] [,3] [,4]

[1,] 1 5 9 13

[2,] 2 6 10 14

[3,] 3 7 11 15

[4,] 4 8 12 16

> eigen(a)

$values

[1] 3.620937e+01 -2.209373e+00 -1.050249e-15 8.203417e-16

$vectors

[,1] [,2] [,3] [,4]

[1,] -0.4140028 -0.82289268 0.4422036 -0.1001707

[2,] -0.4688206 -0.42193991 -0.3487083 0.5349238

[3,] -0.5236384 -0.02098714 -0.6291942 -0.7693354

[4,] -0.5784562 0.37996563 0.5356989 0.3345823

計算矩陣行列式,det()函式:

a同上:

> det(a)

[1] 2.092279e+13

矩陣奇異值分解,svd()函式:

函式 svd(m)

可以把任意乙個矩陣

m作為乙個引數,且對

m進行奇異值分解。這包括

乙個和m

列空間一致的正交列

u的矩陣,乙個和

m行空間一致的正交列

v的矩陣,以及

乙個正元素

d的對角矩陣,如

m = u %*% d %*% t(v)。d

實際上以對角元素向量的形

式返回。

svd(m)

的結果是由

d, u和v

構成的乙個列表。

qr():對矩陣進行qr分解

chol():cholesky分解

sweep():數值分析批量運算子

例如:可以使用sweep運算子給矩陣第一行加1,第二行加2,第三行加3

> m

[,1] [,2] [,3] [,4]

[1,] 1 4 7 10

[2,] 2 5 8 11

[3,] 3 6 9 12

> sweep(m,1,c(1,2,3),"+")

[,1] [,2] [,3] [,4]

[1,] 2 5 8 11

[2,] 4 7 10 13

[3,] 6 9 12 15

矩陣篩選將維,解決方法:

例子:> a<-array(1:20, dim=c(4,5))

> m[1,]

x y

1 2

> m[1,,

drop=false]

x y

[1,] 1 2

在上面,第二行**可以看到a降維了,可以設定drop=false解決。

Python操作多維陣列和矩陣

首先來看乙個簡單的二維 投擲兩枚骰子時,有36種可能的結果。我們可以將其製成乙個二維 行和列分別代表一枚骰子的得數 1 2 3 4 5 6 1 2 3 4 5 6 7 2 3 4 5 6 7 8 3 4 5 6 7 8 9 4 5 6 7 8 9 10 5 6 7 8 9 10 11 6 7 8 9...

陣列與矩陣函式操作

for acmer 道路千萬條,別走這一條 優點 七次乘法和十八次加法完成運算 基於遞迴分治策略 缺點 不穩定,佔記憶體大 邏輯實現 p1 a11 a22 b11 b22 p2 a21 a22 b11 p3 a11 b12 b22 p4 a22 b21 b11 p5 a11 a12 b22 p6 a...

Numpy 陣列和矩陣

numpy包含了兩種基本型別 陣列ndarray和矩陣matrix numpy陣列中所有元素的型別必須是相同的 1 建立陣列 ndarray又叫多維陣列物件,建立陣列的最簡單的方式就是使用array函式,它接受一切序列化的物件 包括其他陣列 然後產生乙個新的含有傳入資料的numpy陣列 通過tupl...