2016-06-08 5 views
2

Я просмотрел несколько сообщений об этой ошибке. Тем не менее, я считаю, что мои матрицы являются подходящими размерами, и я все еще получаю эту ошибку. Затем я подумал, что проблема была классной, но они являются объектами матрицы. Я не уверен, что происходит. Вот функция, я пишу:Ошибка в R: несоответствующие массивы

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 степеней. Они указаны кем угодно. Мне нужен Вандермонд, чтобы решить проблему

V (п) * X = F (п)

, где V состоит из п = {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) 
} 
} 

где в случае Н п = 14, и я пусть т = 10. Отметим, что вход H $ Место и ожидаемый результат - H $ Value.

+1

Можете ли вы указать данные и/или код, который предоставит нам [воспроизводимый пример] (http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example)? –

+0

@BenBolker: Спасибо за ваш интерес. Я изменил свой вопрос, чтобы включить данные и код, чтобы помочь вам увидеть, что я вижу. – user1723196

+0

'dim (diag (s $ d [-k]))' равно 9x9; 'dim (t (v))' равно 9x11. Вы имеете в виду матричное умножение ('% *%') вместо того, чтобы брать продукт Hadamard (elementwise)? (Вы из MATLAB, где '*' обозначает умножение матрицы?) –

ответ

2

Основываясь на нашем разговоре в комментариях, вам нужно использовать

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

в вашей функции для того, чтобы выполнить матрицу умножения. В R (в отличии от MATLAB), * обозначает произведение Адамар (поэлементное умножение, .* в MATLAB), что может быть сделано только на матрицах с одинаковыми размерами, в то время как %*% обозначает обычное матричное умножение, которое требует только ncol(A)==nrow(B) для A %*% B.