ผกผันของเมทริกซ์ใน R


90

ฉันสงสัยว่าคุณแนะนำวิธีใดในการคำนวณผกผันของเมทริกซ์

วิธีที่ฉันพบดูเหมือนจะไม่น่าพอใจ ตัวอย่างเช่น,

> c=rbind(c(1, -1/4), c(-1/4, 1))  
> c  
      [,1]  [,2]  
[1,]  1.00 -0.25  
[2,] -0.25  1.00  
> inv(c)  
Error: could not find function "inv"  
> solve(c)    
          [,1]      [,2]  
[1,] 1.0666667 0.2666667  
[2,] 0.2666667 1.0666667  
> solve(c)*c  
            [,1]        [,2]  
[1,]  1.06666667 -0.06666667  
[2,] -0.06666667  1.06666667  
> qr.solve(c)*c  
            [,1]        [,2]  
[1,]  1.06666667 -0.06666667  
[2,] -0.06666667  1.06666667  

ขอบคุณ!


9
คำแนะนำทั่วไป: หลีกเลี่ยงการตั้งชื่อวัตถุ (เช่นเมทริกซ์) ที่ใช้ไปแล้ว (ที่นี่c)
ถาม

คำตอบ:


155

solve(c)ให้ผกผันที่ถูกต้อง ปัญหาเกี่ยวกับรหัสของคุณคือคุณใช้ตัวดำเนินการผิดสำหรับการคูณเมทริกซ์ คุณควรใช้solve(c) %*% cเพื่อเรียกใช้การคูณเมทริกซ์ใน R

องค์ประกอบ R solve(c) * cดำเนินการโดยคูณองค์ประกอบเมื่อคุณเรียก


22

คุณสามารถใช้ฟังก์ชันginv () (Moore-Penrose generalized inverse) ในแพ็คเกจMASS


@xeon ไม่แน่ใจว่าคุณพลาดได้อย่างไร - ดู p. 60 ของคู่มือสำหรับแพ็คเกจที่อ้างถึงในคำตอบของฉันด้านบน
doug

ขอบคุณสำหรับคำตอบ. ฉันได้รับข้อผิดพลาดนี้เมื่อเรียกใช้ฟังก์ชัน fem () จากแพ็คเกจ FisherEM ใช้ Mavericks Mac OS X.
Vladislavs Dovgalecs

9

โปรดทราบว่าหากคุณสนใจความเร็วและไม่จำเป็นต้องกังวลเกี่ยวกับความเป็นเอกฐานsolve()ควรเลือกใช้ginv()เพราะเร็วกว่ามากเนื่องจากคุณสามารถตรวจสอบได้ดังนี้

require(MASS)
mat <- matrix(rnorm(1e6),nrow=1e3,ncol=1e3)

t0 <- proc.time()
inv0 <- ginv(mat)
proc.time() - t0 

t1 <- proc.time()
inv1 <- solve(mat)
proc.time() - t1 
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.