Назад к материалам

Поиск минимального элемента в строке матрицы

Поиск минимального элемента в строке матрицы

Поиск минимального элемента в строке матрицы

Поиск минимального элемента в строке матрицы

Рассмотрим задачку из линейной алгебры: как найти наименьший элемент в строке матрицы в scilab, без использования встроенной функции.

А встроенные полезные функции для работы с матрицами описаны в этом материале, а линейной алгебры - в этом.

Постановка задачи

Сформировать матрицу по правилу .
Определить наименьший элемент в каждой строке матрицы и записать его в
соответствующий элемент вектора . Вывести на экран сформированную
матрицу и полученный вектор , сравнить результат со встроенной функцией.

Приступим к работе

Создадим заглушку функции, которая будет генерировать элементы матрицы по заданному правилу:

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

Формируем матрицу

Ищем заданный элемент в строке

Разобьем поиск заданного элемента в строке матрицы на два процесса: раздел матрицы по строкам в цикле и сам поиск элемента в функции . (Так будет удобно модифицировать функцию поиска элемента с наименьшего на наибольший, например).
Результат запишем в вектор .

Пройдёмся по строкам матрицы:

function mVector = createMinVector(iMAtrix)
    
    rows = size(iMAtrix, 'r'); //узнаём число строк в матрице
   
    mVector = []; //задел для вектора наименьших элементов
    
    for i = 1:rows //бежим по строка матрицы
        mVector(i) = findMinInRow( iMAtrix(i,:) ); //передём строку матрицы в функцию поиска мин элемента в ней
    end    
    
endfunction 

Начали обход матрицы

Искать наименьший элемент в строке матрицы будем перебором.

В переданной строке , примем, что первый элемент - есть искомый .
Далее, пробегая строку, т.е. увеличивая номер столбца, будем сравнивать текущий элемент с "минимальным" . Если найденный будет меньше минимального - обновим минимальный.

Код пользовательской функции поиска мин элемента будет слудующий:

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