|
|
|||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||
|
|
|||||||||||||||||||||||||||||||||
| Вход | |||||||||||||||||||||||||||||||||
|
Раздел "MATLAB\MATLAB"
В.Г.Потемкин "Введение в Matlab" (v 5.3) В оглавление книги \ К следующему разделу \ К предыдущему разделу \ Предметный указатель 5.3. Работа с многомерными массивами. Индексация. Переопределение размеров. Вычисления на многомерных массивах. Организация данных в многомерных массивах Много приемов, связанных с работой с двумерными массивами, переносится на многомерные. В этом разделе описано, как применяется техника индексации и переопределения размеров к многомерным массивам. В качестве сквозного примера будем рассматривать 3-мерный массив нормально распределенных случайных целых чисел nddata размера 4х5х3: nddata = fix(8*randn(4, 5, 3))
nddata(:, :, 2) =
nddata(:, :, 3) =
Индексация. Чтобы получить доступ к элементу (3, 2) на странице 2 массива nddata, надо использовать обращение nddata(3, 2, 2). В качестве индексов можно использовать вектор, каждый элемент которого должен быть допустимым индексом многомерного массива. Чтобы получить доступ к трем элементам (2, 1), (2, 3) и (2, 4) на странице 3 массива nddata, надо использовать обращение nddata(2, [1 3 4], 3) Индексация столбцов многомерных массивов. Индексация столбцов, широко применяемая в системе MATLAB, может быть распространена и на многомерные массивы. Пример. nddata(:, 3, 2)
Используя индексацию столбцов, можно извлечь следующий массив размера 2х2 со страницы 1 массива nddata: nddata(2:3,2:3,1)
Индексация столбцов может быть использована как в правой, так и в левой частях оператора присваивания. Пример. C = zeros(4, 4)
Теперь разместим в центре массива С подмассив nddata(2:3, 1:2, 2) размера 2х2, извлеченный из многомерного массива nddata: C(2:3, 2:3) = nddata(2:3, 1:2, 2)
Неоднозначность многомерной индексации. Некоторые типы операторов присваивания, например, A(:, :, 1) = 1:10, в случае многомерных массивов не обеспечивают однозначности, поскольку не содержат достаточной информации для выполнения оператора присваивания. В данном случае делается попытка присвоить 1-мерный массив 2-мерному подмассиву массива А. Система MATLAB в таких случаях выдает сообщение об ошибке. Чтобы обеспечить однозначность, необходимо убедиться, что данные и массив-адресат имеют согласованные размеры. Пример. A(1, :, 1) = 1:10 Переопределение размеров. Изменение размеров и структуры многомерного массива может происходить в двух случаях :
Для выполнения второй группы операций предназначена функция reshape, синтаксис которой для многомерного случая имеет вид B = reshape(A, [s1 s2 s3 ...]) где s1, s2,.... - новые значения размерностей. Пример. B = reshape(nddata, [6 10])
C = reshape(nddata, [5 4 3])
Рис. 5.9. 3-мерный массив размера 5х4х3. D = reshape(nddata, [2 3 2 5])
Рис. 5.10. 4-мерный массив размера 2х3х2х5. Удаление размерностей размера 1х1. Система MATLAB создает размерности размера 1х1, если такая спецификация указывается точно при создании или переопределении массива, либо если в процессе вычислений возникает массив размера 1х1. Пример. B = repmat(5, [2 3 1 4])
Рис. 5.11. 4-мерный массив размера 2х3х1х4. size(B) Функция squeeze удаляет из многомерного массива измерение размера 1х1: C = squeeze(B)
Рис. 5.12. 3-мерный массив размера 2х3х4. size(C) Замечание: Функция squeeze транспонирует вектор-строку в вектор-столбец; вектор-столбец функция squeeze оставляет без изменения. Перестановки размерностей. Функция permute позволяет выполнить перестановку размерностей B = permute(A, dims); где dims - вектор, который задает новый порядок следования размерностей. При этом индекс 1 соответствует строкам, индекс 2 - столбцам, индекс 3 - страницам и т. д.
Рис. 5.13. Применение функции permute Функция ipermute обратна по отношению к функции permute. Вводя массив A и вектор перестановок v, функция ipermute формирует такой массив B, что функция permute(B, v) возвращает A. Пример. D = ipermute(C, [1 4 2 3])
а)
б) Рис. 5.14. Применение функции ipermute: Обратите внимание, что функции permute и ipermute используют один и тот же вектор перестановок. Вычисления на многомерных массивах. Многие функции системы MATLAB допускают использование многомерных массивов в качестве входных аргументов. Есть функции, которые могут использовать только отдельные размерности, соответствующие матрицам, векторам или отдельным элементам. Функции, работающие с векторами. Функции, использующие векторы, такие как sum, mean, по умолчанию используют в качестве аргумента первую размерность многомерного массива, значение которой не равно 1. Большинство таких функций позволяют пользователю указать ту конкретную размерность, которую надо использовать в качестве входа. Однако есть и некоторые исключения. Например, функция cross использует в качестве входного аргумента первую размерность с длиной вектора, равной 3. В ряде случаев могут возникать и другие ограничения на входные аргументы. Например, может потребоваться, чтобы массивы имели одинаковые размеры. В любом случае это означает, что при работе с многомерными массивами надо внимательно следить за требованиями, которые предъявляет используемая функция к входным аргументам. Функции, работающие с отдельными элементами. Функции системы MATLAB, которые оперируют с отдельными элементами двумерного массива, будут точно также работать и с элементами многомерного массива. В первую очередь, это все элементарные функции. Например, функция sin всегда возвращает массив того же размера, как и массив входа. Каждый элемент выходного массива является синусом соответствующего элемента входного массива. Точно также операторы отношения и логические операторы используют отдельные элементы многомерного массива. Если один из операндов - скаляр, а другой массив, то исполняемый оператор сопоставляет скаляр с каждым элементом массива. Функции, работающие с матрицами. Функции линейной алгебры и матричные функции из каталога matfun не допускают многомерные массивы в качестве входных аргументов. Если такое происходит, то появляется сообщение об ошибке. Использовать такие матричные функции можно только по отношению к двумерным подмножествам многомерного массива. Пример. A = cat(3, [1 2 3; 9 8 7; 4 6 5], [0 3 2; 8 8 4; 5 3 5],…
Рис. 5.15. 3-мерный массив размера 3х3х3. Применение функции вычисления собственных значений eig к массиву в целом вызовет ошибку: eig(A) Однако ее можно применять к 2-мерным множествам. Пример. eig(A(:, :, 2))
Для того чтобы вычислить собственные значения для матрицы, составленной из вторых строк каждого массива, надо использовать функцию squeeze, которая преобразует 3-мерное подмножество A(2, :, :) размера 1x3x3 в матрицу размера 3x3. Функция eig(A(2, :, :)) выдает ошибку eig(A(2,:,:)) Функция eig(squeeze(A(2, :, :))) вычисляет собственные значения (но не собственные векторы - вспомните о транспонировании строк при использовании функции squeeze) абсолютно правильно eig(squeeze(A(2, :, :)))
Организация данных в многомерных массивах. Существует два подхода к тому, как организовать данные в многомерный массив:
Первый подход использовался на протяжении всего раздела. Второй может представлять интерес при решении уравнений в частных производных, а также физических задач и измерений. Применение последнего подхода проиллюстрируем на примере измерения температуры в равноотстоящих точках в пределах некоторого объема. В этом случае каждое измерение привязано к определенной точке 3-мерного пространства и такие данные могут быть организованы в 3-мерный массив (рис. 5.16): рассмотрим 3-мерный массив TEMP
Рис. 5.16. Массив TEMP размера 3x3x3. Для вычисления среднего значения температуры в этом объеме можно использовать оператор mean(mean(mean(TEMP))). Для вычисления значений температуры посередине этого объема - элементы (2, 2) на каждой странице - надо применить оператор B = TEMP(2, 2, :). В оглавление книги \ К следующему разделу \ К предыдущему разделу \ Предметный указатель
|
|
Всероссийская научная конференция "Проектирование научных и инженерных приложений в среде MATLAB" (май 2002 г.)
|
||
| На первую страницу \ Сотрудничество \ MathWorks \ SoftLine \ Exponenta.ru \ Exponenta Pro | ||
| E-mail: | ||
| Информация на сайте была обновлена 11.05.2004 |
Copyright 2001-2004 SoftLine Co Наши баннеры |
|