openlang

Короткий скрипт из MATLAB в R, и один результат оказался матрицей

Пытаюсь переписать на R короткий скрипт из MATLAB, а с MATLAB я почти не работала. Почти всё перенеслось нормально, кроме одной строки, которая даёт другие числа.

A = [2 0; 1 3];
w = [0.5; 0.25];
s = A * w;
B = A .* A;
A <- matrix(c(2, 0, 1, 3), nrow = 2, byrow = TRUE)
w <- c(0.5, 0.25)
s <- A * w
B <- A * A
s
#>      [,1] [,2]
#> [1,] 1.00 0.00
#> [2,] 0.25 0.75

B совпадает с MATLAB. s в MATLAB - два числа, 1 и 1.25, а в R получается целая матрица 2 на 2, без ошибки и без предупреждения. Я проверила, что A печатается одинаково в обоих, так что дело не в byrow. В R, похоже, нет .*, поэтому я просто везде убрала точку. Ошибка в этом или в том, как я собрала w?

Переведено с английскогоПоказать оригинал

Разговор продолжается 7

Следуя доводам
  1. Ссылка на ответ

    У вас наоборот. В MATLAB .* - это матричное произведение, а * поэлементное, как * в R, так что s должно совпадать как написано. Смотрите лучше на w. c() даёт простой вектор, а не столбец, и R повторяет его по кругу по всей матрице.

    Переведено с английскогоПоказать оригинал
  2. Ссылка на ответ

    Наоборот. В MATLAB * между матрицами - матричное произведение, а .* поэлементное. В R ровно противоположно. * поэлементное, а %*% - произведение.

    s <- A %*% w
    s
    #>      [,1]
    #> [1,] 1.00
    #> [2,] 1.25

    w как простой вектор годится. %*% считает его столбцом, когда так сходятся размеры. B совпало только потому, что A .* A и A * A оба поэлементные. Убрать точку было правильно в той строке и неправильно в другой.

    Переведено с английскогоПоказать оригинал
  3. Ссылка на ответ

    Да, у меня они были перепутаны местами. Точка в MATLAB означает поэлементную операцию, поэтому R она и не нужна. А про c() всё в силе. У простого вектора нет ориентации, и %*% выбирает её сам.

    Переведено с английскогоПоказать оригинал
  4. Ссылка на ответ

    Строка в R считает вполне осмысленную вещь, просто не A * w из MATLAB. R повторяет w вдоль каждого столбца, так что строка i умножается на w[i]. Это A .* w из MATLAB, где w столбец. Результат 2 на 2 верен для этого выражения.

    Переведено с английскогоПоказать оригинал
  5. Ссылка на ответ

    И делает это молча, потому что длины делятся. R предупреждает о повторении вектора, только когда большая длина не кратна меньшей, а четыре элемента на два веса делятся ровно. С w из трёх элементов было бы хотя бы предупреждение. Когда веса действительно построчные, лучше sweep(A, 1, w, "*"), чтобы намерение было видно в коде.

    Переведено с английскогоПоказать оригинал
  6. Ссылка на ответ

    Та же ловушка, только символов больше. A^2 в MATLAB - матричная степень, то есть A * A. A^2 в R возводит в квадрат каждый элемент. A' в MATLAB транспонирует, в R для вещественной матрицы это t(A). A \ b в MATLAB решает систему, в R это solve(A, b), и / между матрицами в MATLAB тоже решает систему, а R делит поэлементно. Пройти по скрипту и проверить каждый *, ^ и /, где по обе стороны матрица.

    Переведено с английскогоПоказать оригинал
  7. Ссылка на ответ

    Да, дело было в этом, спасибо. s <- A %*% w теперь даёт 1 и 1.25. Результат приходит матрицей 2 на 1, поэтому перед таблицей он проходит через drop(). Ниже в полном скрипте нашёлся ещё A^2, и список pgr поймал его раньше, чем он стал следующей загадкой.

    Переведено с английскогоПоказать оригинал

Другие стороны того же вопроса

  1. na.rm = TRUE на группе, где всё NA

    Итоги по группам через tapply(x, g, sum, na.rm = TRUE), и одна группа вернулась с 0. Все значения в ней NA. Ни одного измерен…

    Ответы 5r
  2. sum(X) на матрице из одной строки

    Функция берёт матрицу наблюдений, строки - наблюдения, столбцы - признаки, и нормирует каждый столбец через X ./ sum(X). Долг…

    Ответы 6matlab
  3. Цикл, который выделял память на каждый столбец

    Срезы в Julia копируют. Это известно, но внутри цикла вылетело из головы. Возьмём функцию, которая идёт по столбцам матрицы и…

    Ответы 4julia