Спеціальні дії з числами та структурами в системі MatLab, реалізовані через функції. Порозрядне оброблення даних
MatLab має спеціальний набір функцій, які є елементарними математичними діями з числами та множинами, і тому вони розглядаються як операнди. До цього класу функцій належать побітові операції з числами (Bitwise operators) та функції оброблення множин (Set operators). Ці функції MatLab розробники віднесли до класу операторів, система допомоги видає їх у списку операторів при виконанні команди help ops.
Окреме місце займають побітові дії з числами. Відомо, що комп’ютер здійснює побайтове оброблення даних, і навіть у мові програмування Асемблер побітові дії виконуються над байтами даних за допомогою відповідних команд, а у більшості мов програмування високого рівня, таких як Pascal, FORTRAN, побітові дії неможливі. Але такі дії часто необхідні програмістам для реалізації ефективних алгоритмів оброблення даних, особливо при програмуванні зовнішніх апаратних пристроїв та при розв’язанні інших задач системного програмування. Тому можливість виконання побітових дій у MatLab зайвий раз доводить,що ця система створена для фахівців?програмістів і призначена для розв’язання нетривіальних задач програмування. У MatLab функції побітових дій здійснюються тільки з додатними натуральними числами. Наведемо перелік функцій системи, призначений для виконання побітових операцій. Зверніть увагу на те, що аргументами функцій можуть бути матриці.
bitand (M1,M2) — функція поелементно виконує побітове «І» для всіх елементів матриць M1 та M2, розмір яких повинензбігатися, якщо одна з матриць не є числом.
bitcmp(M1,M2)— функція виконує побітове доповнення всіх елементів матриць M1 та M2. Розміри цих матриць повинні бути однаковими, якщо одна з них не є числом. Функція d(m, n) побітового доповнення числа m до числа n у двійковій арифметиці визначається так:
d(m, n)=2n– 1 – m.
bitor (M1,M2) — функція поелементно виконує побітове «АБО» для всіх елементів матриць M1 та M2, розміри яких повинні бути однаковими, якщо одна з матриць не є числом.
bitmax— системна змінна, яка повертає значення максимального цілого беззнакового числа, що може бути подано у форматі з плаваючою комою на даному комп’ютері. Для обчислювальних машин з арифметикою стандарту IEEE, якому відповідають і комп’ютери IBM PC, це значення дорівнює 253– 1. Наприклад:
>> 2^53-1
ans =
9.007199254740991e+015
>> bitmax
ans =
9.007199254740991e+015
>>
bitset (M1,M2) — функція встановлює одиничне значення у відповідному біті числа, при цьому змінюваному числу відповідає елемент матриці M1,ана порядковий номер змінюваного біта вказує відповідний елемент матриці M2.Розміри матриць M1та M2 повинні бути однаковими, якщо одна з цих матриць не є числом.
bitset (M1,M2,M3) — функція встановлює одиничне або нульове значення у відповідному біті числа, при цьому змінюваному числу відповідає елемент матриці M1, на порядковий номер змінюваного біта вказує елемент матриці M2, а матриця M3 повинна складатися тільки з нулів або одиниць, та її відповідний елемент визначає значення змінюваного біта. Розмірність матриць M1, M2 та M3 повинна бути однаковою, якщо будь-яка з них не є числом.
bitget(M1,M2)— функція зчитує значення біта числа, у цьому разі числу, яке читається, відповідає елемент матриці M1, а порядковий номер біта, указує елемент матриці M2. Розміри матриць M1 та M2 повинна бути однаковою, якщо одна з цих
матриць не є числом.
bitshift (M1,M2) — функція поелементно виконує логічний зсув праворуч або ліворуч всіх елементів матриці M1, при цьому кількість позицій зсуву визначається відповідними елементами матриці M2. На відміну від попередніх функцій побітового оброблення даних, елементами матриці M2 можуть бути як додатні, так і від’ємні числа. При додатних значеннях елементу матриці M2 здійснюється логічний зсув ліворуч, а при від’ємних — праворуч. Розміри матриць повинні бути однаковими, якщо одна з матриць не є числом. Як відомо з основ двійкової арифметики, зсув на n позицій ліворуч відповідає множенню числа на 2n, а зсув праворуч — його діленню на 2n,або множенню на 2–n[7, 10].
bitxor (M1,M2) — функція поелементно виконує побітове «виключного АБО» для всіх елементів матриць M1та M2, розміри яких повинні бути однаковими, якщо одна зматриць не є числом.
Якщо програміст не впевнений, що операнди функцій побітового оброблення є цілими числами, рекомендується використовувати їх разом з функціями округлення.
Наведемо приклад використання побітових дій оброблення \даних.
Приклад >> A=[1,2;3,4]
A=
1 2
3 4
>> B=[1,7;3,8]
B=
1 7
3 8
>> C=bitand(A,B)
C=
1 2
3 0
>> D=bitor(A,B)
D=
1 7
3 12
>> E=bitcmp(A,5)
E=
30 29
28 27
>> U=bitcmp(C,5)
U=
30 29
28 31
>> G=bitset(C,4)
G=
9 10
11 8
>> F=[1,0;0,1]
F=
1 0
0 1
>> H=[2,3;4,5]
H=
2 3
4 5
>> I=bitset(C,H,F)
I=
3 2
3 16
>> J=bitget(D,H)
J=
0 1
0 0
>> K=bitshift(E,H)
K=
120 232
448 992
>> L=bitshift(E,?H)
L=
7 3
1 0
>> M=bitxor(H,L)
M=
5 0
5 5
>>
Дії з множинами
Множина— це одне з первинних понять математики, яке визначає неупорядковану сукупність об’єктів будь- якої фізичної природи. Дії з множинами у сучасній математиці стали класичними та ефективно використовуються для оброблення
неупорядкованих структур. У системі MatLab дії з множинами виконуються через наведені нижче функції оброблення векторів та матриць.
intersect (V1,V2) — функція обчислює вектор, який має спільні елементи векторів V1 та V2, упорядковані за зростанням. Ця функція відповідає математичній дії перетину двох множин. Недолік роботи цієї функції у наведеному форматі полягає в тому, що вона не надає інформації про номери спільних елементів, тому існує ще один спосіб використання цієї функції:
[R1,R2,R3]=intersect (V1,V2)
вектор R1 містить спільні елементи векторів V1 та V2, вектор R2 визначає їх порядкові номери у векторі V1, а R3 — порядкові номери у V2.
intersect (M1,M2, ‘rows’) — функція обчислює матрицю, яка має спільні рядки порівнюваних матриць M1, M2, у цьому разі вони повинні мати однакову кількість стовпчиків.
ismember (V1,V2) — результатом роботи функції є вектор, розмір якого збігається з розміром вектора V1. Елемент вектора результата дорівнює 1, якщо відповідний елемент вектора V1 входить до множини, яка визначається вектором V2, в ін. шому разі цей елемент дорівнює 0.
ismember (M1,M2, ‘rows’) — результатом роботи функції є вектор, кількість елементів якого відповідає кількості стовпчиків у матрицях M1 та M2, при цьому матриці повинні мати однакову кількість стовпчиків. Елемент вектора дорівнює 1, як?
що відповідний рядок матриці M1 є рядком M2, в іншому разі елемент вектора результата дорівнює 0.
setdif (V1,V2) — результатом роботи функції є вектор, який містить усі елементи вектора V1, які не є елементами вектора V2. У математиці таку дію називають різницею двох множин. Елементи вектора результату сортуються у бік збільшення.
Функція setdif (V1,V2) використовується також у форматі:
[R1,R2]= setdif (V1,V2)
У наведеному виразі вектор R1має елементи вектора V1, які не є елементами V2, авектор R2визначає їх порядковий номер.
setdif (M1,M2, ‘rows’) — результатом роботи функції є матриця, що містить усі рядки M1, які не є рядками M2, при цьому матриці M1та M2 повинні мати однакову кількість стовпчиків.
setxor (V1,V2) — результатом роботи функції є вектор, який містить усі елементи векторів V1 та V2, які не є для них спільними. Тобто, вектор результату має ті елементи, які не є перетином двох множин. Результат сортується у бік збільшення.
Функція setdif (V1,V2) використовується також у форматі:
[R1,R2,R3]= setxor (V1,V2)
У наведеному виразі вектор R1 містить усі неспільні елементи векторів V1 та V2, вектор R2 визначає їх порядковий номер у векторі V1, а вектор R3 — порядковий номер у векторі V2.
setxor (M1,M2, ‘rows’) — результатом роботи функції є матриця, що містить усі рядки матриць M1 та M2, які не є для них спільними, при цьому матриці M1 та M2 повинні мати одна кову кількість стовпчиків.
union (V1,V2) — результатом роботи функції є вектор, який містить усі елементи векторів V1 та V2, але без повторень. Елементи вектора результату сортуються у бік збільшення. У математиці таку дію називають об’єднанням двох множин.
Функція union (V1,V2) використовується також у форматі:
[R1,R2,R3]= union (V1,V2)
У наведеному виразі вектор R1містить усі елементи векторів V1 та V2без повторень, R2визначає їх порядковий номер у векторі V1, а R3 — порядковий номер у векторі V2.
union (M1, M2, ‘rows’) — результатом роботи функції є матриця, що містить усі рядки матриць M1 та M2 без повторень, у цьому разі матриці M1 та M2 повинні мати однакову кількість стовпчиків;
unique (V1) — результатом роботи функції є вектор, який має елементи вектора V1 без повторень;
unique (M1, ‘rows’) — результатом роботи функції є матриця, що має рядки матриці M1 без повторень.
Наведемо приклад використання дій з множинами для оброблення структур числових даних.
Приклад
>> M1=[2,3,4;4,3,5;5,6,7];
>> M2=[3,5,4;4,3,5;5,6,7];
>> V1=[2,3,4,5,6,7];
>> V2=[3,4,6,7,8,1];
>> intersect(V1,V2)
ans =
3 4 6 7
>> [A,B,C]=intersect(V1,V2)
A=
3 4 6 7
B=
2 3 5 6
C=
1 2 3 4
>> intersect(M1,V2,’rows’)
??? Error using ==> intersect
A and B must have the same number of columns.
>> intersect(M1,M2,’rows’)
ans=
4 3 5
5 6 7
>> ismember (A,V1)
ans=
1 1 1 1
>> ismember (M1,M2,’rows’)
ans=
>> ismember (A,C)
ans=
1 1 0 0
>> setdiff(A,C)
ans=
6 7
>> [D,E]=setdiff(A,C)
D=
6 7
E=
3 4
>> setdiff(M1,M2,’rows’)
ans=
2 3 4
>> setdiff(M2,M1,’rows’)
ans=
3 5 4
>> setxor (A,B)
ans=
2 4 5 7
>> [F,G]=setxor (A,B)
F=
2 4 5 7
G=
2 4
>> setxor (M1,M2,’rows’)
ans=
2 3 4
3 5 4
>> union (V1,V2)
ans=
1 2 3 4 5 6 7 8
>> [H,K]=union (A,B)
H=
2 3 4 5 6 7
K=
2 4
>> union (M1,M2,’rows’)
ans=
2 3 4
3 5 4
4 3 5
5 6 7
>> unique (V1)
ans=
2 3 4 5 6 7
>> V3=[2,5,6,2,6,4,5,2]
V3=
2 5 6 2 6 4 5 2
>> unique (V3)
ans=
2 4 5 6
>> M3=[V1;V2;V1]
M3=
2 3 4 5 6 7
3 4 6 7 8 1
2 3 4 5 6 7
>> unique (M3)
ans=
>> unique (M3, ‘rows’)
ans=
2 3 4 5 6 7
3 4 6 7 8 1
>>
Дата добавления: 2016-05-11; просмотров: 721;