Javascript must be enabled in your browser to use this page.
Please enable Javascript under your Tools menu in your browser.
Once javascript is enabled Click here to go back to �нтеллектуальная Кобринщина

Update Parts of a Matrix - Wolfram Mathematica

Обновление частей матриц

Mathematica содержит много матричных операций, которые обеспечивают построение, вычисление и визуализацию матриц. Она также обладает богатым набором команд для выборки частей матриц и задания им новых значений.

Зададим матрицу:

In[1]:=

UpdatePartsOfAMatrixRU_1.gif

Out[2]//MatrixForm=

UpdatePartsOfAMatrixRU_2.gif

Используем [[...]] (краткую форму записи для Part) в левой части определения, для присвоения нового значения одному из элементов матрицы:

In[3]:=

UpdatePartsOfAMatrixRU_3.gif

Out[3]=

UpdatePartsOfAMatrixRU_4.gif

Покажем, что элемент на позиции (1, 2) был обновлен:

In[4]:=

UpdatePartsOfAMatrixRU_5.gif

Out[4]//MatrixForm=

UpdatePartsOfAMatrixRU_6.gif

Для того, чтобы обновить целую строку, воспользуемся только одним индексом, чтобы указать строку, и присвоим ей новый список значений:

In[5]:=

UpdatePartsOfAMatrixRU_7.gif

Out[6]//MatrixForm=

UpdatePartsOfAMatrixRU_8.gif

Для обновления целого столбца, выберем все строки при помощи параметра All и укажем номер столбца:

In[7]:=

UpdatePartsOfAMatrixRU_9.gif

Out[8]//MatrixForm=

UpdatePartsOfAMatrixRU_10.gif

    

Для обновления подматрицы, воспользуемся краткой формой записи функции Span (;;).

Для начала создадим матрицу 5?5 из случайных целых чисел в диапазоне от 0 до 10:

In[24]:=

UpdatePartsOfAMatrixRU_11.gif

Out[25]//MatrixForm=

UpdatePartsOfAMatrixRU_12.gif

Матрица 3?4 верху слева, выделенная цветом, соответствует строкам с индексами от 1 до 3 и столбцам с индексами от 1 до 4:

0 1 4 1 3
0 10 9 4 9
3 7 7 10 2
1 8 5 10 4
10 10 8 8 1

Обновим выделенную подматрицу, использовав краткую форму записи для Span (;;) для охвата соответствующих диапазонов строк и столбцов:

In[26]:=

UpdatePartsOfAMatrixRU_13.gif

Out[27]//MatrixForm=

UpdatePartsOfAMatrixRU_14.gif

Обновим все элементы, за исключением крайних строк и столбцов (отрицательные индексы начинают отсчет с конца) :

In[28]:=

UpdatePartsOfAMatrixRU_15.gif

Out[29]//MatrixForm=

UpdatePartsOfAMatrixRU_16.gif

    

Когда Вы обновляете большую матрицу, необходимо, по возможности, избегать применения циклических операций. Если Вы можете использовать один из методов для обновления всех элементов одной командой, это , как правило, будет гораздо быстрее:

In[36]:=

UpdatePartsOfAMatrixRU_17.gif

Вот медленный способ для обновления каждого элемента в строке:

In[37]:=

UpdatePartsOfAMatrixRU_18.gif

Out[37]=

UpdatePartsOfAMatrixRU_19.gif

А этот способ намного быстрее:

In[38]:=

UpdatePartsOfAMatrixRU_20.gif

Out[38]=

UpdatePartsOfAMatrixRU_21.gif

Если без применения циклических операций для обновления матрицы не обойтись, желательно исключить дополнительные ссылки на матрицу. В противном случае, матрица будет копироваться, что вызовет не очень быструю работу цикла:

In[39]:=

UpdatePartsOfAMatrixRU_22.gif

Этот пример кода не содержит лишних ссылок, поэтому цикл работает довольно быстро:

In[40]:=

UpdatePartsOfAMatrixRU_23.gif

Out[40]=

UpdatePartsOfAMatrixRU_24.gif

Такой код делает копию матрицы на каждом шагу, поэтому цикл работает медленно:

In[41]:=

UpdatePartsOfAMatrixRU_25.gif

Out[41]=

UpdatePartsOfAMatrixRU_26.gif