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

Рассмотрим задачку из линейной алгебры: как найти наименьший элемент в строке матрицы в 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

Комментарии

Гость
Ответить
Войдите, чтобы оставить комментарий.
Гость
Ответить
Гость
Ответить
Гость
Ответить
Еще нет комментариев, оставьте первый.