3

我看了几篇关于这个错误的帖子。但是,我发现我的矩阵大小合适,但仍然出现此错误。接下来我认为问题是类,但它们是矩阵对象。我不确定发生了什么事。这是我正在编写的函数:

library(Matrix)
library(MASS)

modify <- function(Vandermonde) {
    s = svd(Vandermonde)
    k = which(s$d < 1e-1)
    u = matrix(s$u[,-k], nrow = nrow(s$u), byrow = FALSE)
    v = matrix(s$v[,-k], nrow = nrow(s$v), byrow = FALSE)

    modify = u * diag(s$d[-k]) * t(v)
}

基本上,我正在编写一个采用矩形矩阵的函数,检查它是否是奇异的。如果是,则使其非单数。我正在检查的矩阵是一个 Vandermonde,它是我在这个函数之外创建的。它是矩形的,因为我有 N 行和 m 次幂。这些由谁指定。我需要 Vandermonde 来解决问题

V(n)*x = f(n)

其中 V 由 n = {1, 2, 3, 4, ..., N} 组成,f(n) 是整数序列的对应项。一个示例序列是 H =

Place        Value
  1 1.000000e+00
  2 3.000000e+00
  3 1.300000e+01
  4 8.700000e+01
  5 1.053000e+03
  6 2.857600e+04
  7 2.141733e+06
  8 5.081471e+08
  9 4.021353e+11
 10 1.073376e+15
 11 9.700385e+18
 12 2.984343e+23
 13 3.147936e+28
 14 1.147438e+34

我创造了范德蒙德

mat = matrix(0,n, m + 1)
for (i in 1:n ) {
 for (j in 1:(m + 1)) {
  mat[i,j] = input[i] ^ (j - 1) 
 }
}

其中,在 H 的情况下,n = 14,我让 m = 10。要注意,输入是 H$Place,预期输出是 H$Value。

4

1 回答 1

2

根据我们在评论中的对话,您需要使用

modify = u %*% diag(s$d[-k]) %*% t(v)

在您的函数中以执行矩阵乘法。在 R 中(与 MATLAB 不同),*表示 Hadamard 乘积(.*在 MATLAB 中的元素乘法),它只能在具有相同维度的矩阵上完成,而%*%表示普通矩阵乘法,它只ncol(A)==nrow(B)需要A %*% B.

于 2016-06-08T02:15:16.027 回答