> x [i] <– 0 # Заменяет те элементы нулями.
> x
Групповая замена
Отрицательные индексы не разрешены при индексировании матрицы. Разрешены NA и нулевое значение: строки в индексной матрице, содержащей нуль, игнорируются, и строки, содержащие NA, производят NA в результате.
Как менее тривиальный пример, предположим, что необходимо генерировать (не приведенную) матрицу проекта для блочной конструкции, определенной блоками факторов (b уровни) и варианты (v уровни). Далее предположим, что в эксперименте есть n рисунков. Можно продолжить следующим образом:
> Xb <– matrix (0, n, b)
> Xv <– matrix (0, n, v)
> ib <– cbind (1:n, blocks)
> iv <– cbind (1:n, varieties)
> Xb [ib] <– 1
> Xv [iv] <– 1
> X <– cbind (Xb, Xv)
Для конструирования индексов матрицы, скажем N, можно использовать:
> N <– crossprod (Xb, Xv)
Однако более простым способом создания этой матрицы является использование table ():
> N <– table (blocks, varieties)
Индексная матрица должна быть числовой: предоставленная любая другая форма матрицы (логическая или символьная) обрабатывается как индексный вектор.
5.4. Функция array ()
Так же, как давая векторной структуре атрибут dim, массивы могут быть созданы из векторов функцией массива array, у которой есть форма:
> Z <– array (data_vector, dim_vector)
Например, если вектор h содержит 24 или менее чисел, тогда команда:
> Z <– array (h, dim=c (3,4,2))
использовал бы h для создания массива Z размером 3-на-4-на-2. Если размер h точно 24, то результат выглядит так:
> Z <– h; dim (Z) <– c (3,4,2)
Однако, если h меньше, чем 24, его значения будут взяты циклически для дополнения до размера 24 (см. Раздел 5.4.1 [Правило рецикличности]), и dim (h) <-c (3,4,2) сигнализировал бы ошибку о несоответствии длине. Как экстремальный, но типичный пример:
> Z <– array (0, c (3,4,2))
делает Z массивом всех нулей.
В этой месте dim (Z) обозначает вектор размерности c (3,4,2), и Z [1:24] содержит вектора данных, как это было в h, и Z [] с пустым нижним индексом или Z без нижнего индекса поддерживает весь массив в качестве массива.
Массивы могут использоваться в арифметических выражениях, и результат является массивом, сформированным поэлементно операциями на векторах данных. Атрибуты dim операндов обычно должны быть одинаковыми, и они становятся вектором размерности результата. Так, если все A, B и C являются подобными массивами, то:
> D <-2*A*B + C +1
делает D подобным массивом с его вектором данных, являющимся результатом данной поэлементно операции. Однако точное правило относительно смешанного массива и векторных вычислений нужно рассмотреть немного более тщательно.
5.4.1. Смешанный вектор и арифметика массива. Правило рецикличности
Точное правило, влияющее поэлементно на смешанные вычисления с векторами и массивами, является более изощренными и точно описаны в ссылках. Из опыта найдено следующее надежное руководство.
– Выражение просматривается слева направо.
– Любые короткие векторные операнды расширяются циклически их значениями, пока они не совпадет с размером любых других операндов.
– Если длинные и короткие вектора с массивами лишь пересчитываются, то все массивы должны иметь одинаковый атрибут dim или будет выдана ошибка.
– Любой векторный операнд более длинный, чем операнд матрицы или массива, генерирует ошибку.
– Если имеются структуры массива, и нет ошибок, или приведение к вектору было выполнено, то результат – структура массива с общим атрибутом dim ее операндов массива.
5.5. Внешнее произведение двух массивов
Важной операуцией на массивах является внешнее произведение. Если a и b – два числовых массива, их внешнее произведение – массив, вектор размерности которого получен, связывая их два вектора размерности (порядок важен), и чей вектор данных получен путем формирования всех возможных произведений элементов вектора а с соответствующим элементами вектора b. Внешнее произведение выполняется специальным оператором %o%:
> ab <-%o % b
Альтернатива
> ab <– outer (a, b, «*»)
Функция умножения может быть заменена произвольной функцией двух переменных. Например, если необходимо оценить функцию f (x; y) = cos (y) / (1 + x
) на регулярной сетке значения с x-и y-координатами, определенными векторами R x и y соответственно, можно продолжить следующим образом:
> f <– function (x, y) cos (y) / (1 + x^2)
> z <– outer (x, y, f)
Особенностью внешнего произведения двух обычных векторов является вдвойне преобразованный в нижний индекс массив (который является матрицей ранга самое большее 1). Заметьте, что оператор внешнего произведения, конечно, некоммутативен. Определение Ваших собственных функций R рассмотрим далее в Главе 10 [написание собственных функций].
Пример: детерминанты с одноразрядными матрицами 2*2
В качестве искусственного, но милого примера, рассмотрим детерминанты матриц [a; b; c; d], где каждый вход – неотрицательное целое число в диапазоне 0; 1;..; 9, которые являются цифрой.
Задача состоит в том, чтобы найти детерминанты ad-bc всех возможных матриц этой формы и представлять частоту, с которой каждое значение имеет место в рисунке высокой плотности. Это количество находится в распределении вероятностей детерминанта, если каждая цифра выбрана независимо и гарантировано случайно.
Аккуратный способ сделать это состоит в двукратном использовании функции outer ():
> d <– outer (0:9, 0:9)
> fr <– table (outer (d, d, "-»))
> plot (fr, xlab=«Determinant», ylab=«Frequency»)