Поиск минимального элемента в строке матрицы
Рассмотрим задачку из линейной алгебры: как найти наименьший элемент в строке матрицы в scilab, без использования встроенной функции.
А встроенные полезные функции для работы с матрицами описаны в этом материале, а линейной алгебры - в этом.
Постановка задачи
Сформировать матрицу \( M(7,5) \) по правилу \( M(i, j) = cos(i^2 - \frac{j}{2}) \). Определить наименьший элемент в каждой строке матрицы и записать его в соответствующий элемент вектора \( V \). Вывести на экран сформированную матрицу и полученный вектор \(V \), сравнить результат со встроенной функцией.
Приступим к работе
Создадим заглушку функции, которая будет генерировать элементы матрицы по заданному правилу:
function iMatrix = createMatrix(rows, cols)
/*тело функции*/
endfunction
initialMatrix = createMatrix(7, 5);
Заготовка функции для формирования матрицы
Создадим заглушку функции, которая будет искать минимальный элемент в каждой строке матрицы и формировать вектор:
function mVector = createMinVector(iMAtrix)
/*тело функции*/
endfunction
myMinVector = createMinVector(initialMatrix);
Заготовка функции для поиска min элемента
Генерируем матрицу
Создавать матрицу по заданному правилу будем построчно во вложенном цикле:
function iMatrix = createMatrix(rows, cols)
iMatrix = []; // задел для матрицы
for i = 1:rows //кол-во строк в матрице
for j = 1:cols //кол-во столбцов в матрице
iMatrix(i, j) = cos(i^2 - j/2); //формируем элемент
end
end
endfunction
Формируем матрицу
Ищем заданный элемент в строке
Разобьем поиск заданного элемента в строке матрицы на два процесса: раздел матрицы по строкам в цикле \(for\) и сам поиск элемента в функции \(findMinInRow\). (Так будет удобно модифицировать функцию поиска элемента с наименьшего на наибольший, например).
Результат запишем в вектор \(mVector\).
Пройдёмся по строкам матрицы:
function mVector = createMinVector(iMAtrix)
rows = size(iMAtrix, 'r'); //узнаём число строк в матрице
mVector = []; //задел для вектора наименьших элементов
for i = 1:rows //бежим по строка матрицы
mVector(i) = findMinInRow( iMAtrix(i,:) ); //передём строку матрицы в функцию поиска мин элемента в ней
end
endfunction
Начали обход матрицы
Искать наименьший элемент в строке матрицы будем перебором.
В переданной строке \(curRow\), примем, что первый элемент \(curRow(1)\) - есть искомый \(curMinElement\).
Далее, пробегая строку, т.е. увеличивая номер столбца, будем сравнивать текущий элемент \(curRow(j)\) с "минимальным" \(curMinElement\). Если найденный будет меньше минимального - обновим минимальный.
Код пользовательской функции поиска мин элемента будет слудующий:
function curMinElement = findMinInRow(curRow)
cols = size(curRow, 'c'); //узнаём число элементов в строке
curMinElement = curRow(1); //допустим, первый элемент - и есть наш минимальный
for j = 2:cols //теперь бежим по строке, начиная со 2го элемента
if curRow(j) < curMinElement then //если нашелся меньший
curMinElement = curRow(j); //обновим текущий минимальный
end
end
endfunction
Перебираем элементы в строке матрицы
Добавим вектор, полученный с помощью встроенной scilab функции поиска минимального эдемента в строке матрицы:
scilabMinVector = min(initialMatrix,'c');
Встроенная scilab функция поиска min элемента в строке матрицы
Выводим результаты
Вывалим в консоль всё, что нагенерировали:
...
disp('Исходная матрица');
disp(initialMatrix);
disp('Вектор минимальных значений :: моя функция');
disp(myMinVector);
disp('Вектор минимальных значений :: встроенная функция');
disp(scilabMinVector);
...
Встроенная scilab функция поиска min элемента в строке матрицы
Окончательно, наша программа на scilab будет выглядеть так:
clc;
function iMatrix = createMatrix(rows, cols)
iMatrix = []; // задел для матрицы
for i = 1:rows //кол-во строк в матрице
for j = 1:cols //кол-во столбцов в матрице
iMatrix(i, j) = sin(i + j/2); //формируем элемент
end
end
endfunction
function curMinElement = findMinInRow(curRow)
//disp(curRow);
cols = size(curRow, 'c'); //узнаём число элементов в строке
curMinElement = curRow(1); //допустим, первый элемент - и есть наш минимальный
for j = 2:cols //теперь бежим по строен, начиная со 2го элемента
if curRow(j) < curMinElement then //если нашелся меньший
curMinElement = curRow(j); //обновим текущий минимальный
end
end
endfunction
function mVector = createMinVector(iMAtrix)
rows = size(iMAtrix, 'r'); //узнаём число строк в матрице
mVector = []; //задел для вектора наименьших элементов
for i = 1:rows //бежим по строка матрицы
mVector(i) = findMinInRow( iMAtrix(i,:) ); //передём строку матрицы в функцию поиска мин элемента в ней
end
endfunction
initialMatrix = createMatrix(7, 5);
disp('Исходная матрица');
disp(initialMatrix);
scilabMinVector = min(initialMatrix,'c');
disp('Вектор минимальных значений :: встроенная функция');
disp(scilabMinVector);
myMinVector = createMinVector(initialMatrix);
disp('Вектор минимальных значений :: моя функция');
disp(myMinVector);
Работа с матрицами с scilab
Комментарии