Программирование на языке Ruby
Программирование на языке Ruby читать книгу онлайн
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
Следует также знать о прекрасной библиотеке
NArraymatrixЧтобы создать матрицу, мы, конечно же, обращаемся к методу класса. Сделать это можно несколькими способами. Самый простой — вызвать метод
Matrix.[]m = Matrix[[1,2,3], [4,5,6], [7,8,9]]Вместо этого можно вызвать метод rows, передав ему массив массивов (в таком случае «дополнительные» скобки необходимы). Необязательный параметр сору, по умолчанию равный true, указывает, надо ли скопировать переданные массивы или просто сохранить на них ссылки. Оставляйте значение true, если нужно защитить исходные массивы от изменения, и задавайте false, если это несущественно.
Row1 = [2,3]row2 = [4,5]m1 = Matrix.rows([row1,row2]) # copy=truem2 = Matrix.rows([row1,row2],false) # He копировать.row1[1] = 99 # Теперь изменим row1.p m1 # Matrix[[2, 3], [4, 5]]p m2 # Matrix[[2, 99], [4, 5]]Можно задать матрицу и путем перечисления столбцов, если воспользоваться методом
columnsсоруm1 = Matrix.rows([[1,2],[3,4]])m2 = Matrix.columns([[1,3],[2,4]]) # m1 == m2Предполагается, что все матрицы прямоугольные, но это не проверяется. Если вы создадите матрицу, в которой отдельные строки или столбцы длиннее либо короче остальных, то можете получить неверные или неожиданные результаты.
Некоторые специальные матрицы, особенно квадратные, конструируются проще. Так, тождественную матрицу конструирует метод
identityIunitim1 = Matrix.identity(3) # Matrix[[1,0,0],[0,1,0],[0,0,1]]im2 = Matrix.I(3) # То же самое.im3 = Matrix.unit(3) # То же самое.Более общий метод
scalarsm = Matrix.scalar(3,8) # Matrix[[8,0,0],[0,8,0],[0,0,8]]Еще более общим является метод
diagonaldm = Matrix.diagonal(2,3,7) # Matrix[[2,0,0],[0,3,0],[0,0,7]]Метод
zerozm = Matrix.zero(3) # Matrix[[0,0,0],[0,0,0],[0,0,0]]Понятно, что методы
identityscalardiagonalzeroЧтобы создать матрицу размерности 1×N или N×1, воспользуйтесь методом row_vector или column_vector соответственно.
а = Matrix.row_vector(2,4,6,8) # Matrix[[2,4,6,8]]b = Matrix.column_vector(6,7,8,9) # Matrix[[6],[7],[8],[9]]К отдельным элементам матрицы можно обращаться, указывая индексы в квадратных скобках (оба индекса заключаются в одну пару скобок). Отметим, что не существует метода
[]=m = Matrix[[1,2,3],[4,5,6]]puts m[1,2] # 6Индексация начинается с 0, как и для массивов в Ruby. Возможно, это противоречит вашему опыту работы с матрицами, но индексация с 1 в качестве альтернативы не предусмотрена. Можно реализовать эту возможность самостоятельно:
# Наивный подход... не поступайте так!class Matrix alias bracket [] def [] (i,j) bracket(i-1,j-1) endendm = Matrix[[1,2,3],[4,5,6],[7,8,9]]p m[2,2] # 5На первый взгляд, этот код должен работать. Большинство операций над матрицами даже будет давать правильный результат при такой индексации. Так в чем же проблема? В том, что мы не знаем деталей внутренней реализации класса
Matrix[]К тому же необходимо изменить методы
rowvector[]Иногда необходимо узнать размерность или форму матрицы. Для этого есть разные методы, например
row_sizecolumn_sizeМетод
row_sizecolumn_sizesquare?row_sizecolumn_size
