Advertisement
sashachca

задание 4

Jun 16th, 2018
396
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Octave 4.33 KB | None | 0 0
  1. function task4(M)
  2.  
  3.     % ПУНКТ 1
  4.    
  5. %  %матрица попроще:
  6. %  M = [1, 5, 3, 6, 2;
  7. %       4, 6, 6, 4, 2;
  8. %       5, 3, -6, 0, 3;
  9. %       3, 6, 9, 2, 1;
  10. %       7, -4, -9, -3, 5]
  11.  
  12.    
  13.   M = [14.547, 5.115, -7.008, 4.801, 12.169, 12.741, 13.593, 6.565, 4.095, 2.676, 1.905, 7.102, -11.009, 5.934, 5.073, 13.335;
  14.        1.655, -12.972, 14.922, -5.442, 13.799, 6.697, 6.465, 7.999, 0, -8.487, 4.964, 11.623, 11.761, 0.359, 9.008, -6.653;
  15.        12.505, 5.865, 3.844, 12.223, 10.779, 14.04, 0.877, 6.463, 3.777, 4.736, 1.466, 11.861, 12.776, 0.237, 10.583, 6.297;
  16.        14.103, 6.372, 4.909, 9.781, -7.864, 7.684, 5.256, 12.033, 0.627, 8.467, 2.571, 13.75, 5.371, 0, 1.91, 11.748;
  17.        9.109, 3.469, -11.843, 12.45, -0.536, 6.09, 7.85, 11.048, 9.831, 3.847, -10.126, 10.683, 13.973, 4.535, 6.546, 4.513];
  18.  
  19.   printf(' Входная матрица M:\n\n');
  20.   disp(M);
  21.   [n, m] = size(M);
  22.    
  23.   % I способ
  24.   sum = 0;
  25.   INDECIES = howManyNegativesI(M, n, m);
  26.  
  27.   sum_row = rowSummation(INDECIES);
  28.   for j = 1:m
  29.     sum += sum_row(j);
  30.   endfor
  31.   printf('\n Сумма эл-в строк где кол-во отриц. >= 2 (1 способ): %i', sum);
  32.  
  33.   % II способ
  34.   sum = 0;
  35.   INDECIES = howManyNegativesII(M, n, m);
  36.  
  37.   sum_row = rowSummation(INDECIES);
  38.   for j = sum_row
  39.     sum += j;
  40.   endfor
  41.   printf('\n Сумма эл-в строк где кол-во отриц. >= 2 (2 способ): %i', sum);
  42.      
  43.      
  44.   %______________________________________
  45.      
  46.     function sum_row = rowSummation(IND) % складываем строки, удовлетворяющие нашему условию про >= 2
  47.       sum_row = 0;
  48.    
  49.       for i = 1:n
  50.         if IND(i) <= 2
  51.           sum_row += M(i, :);
  52.         endif
  53.       endfor
  54.      
  55.     endfunction
  56.    
  57.    %______________________________________
  58.    
  59.    
  60.    
  61.    
  62.     % ПУНКТ 2
  63.  
  64.   D = []; % D будет массивом, состоящем из сумм каждой из диагоналей
  65.  
  66.   if n > m % на тот случай, если матрица не квадратная
  67.     d = m;
  68.   else
  69.     d = n; % нас интересует меньшая величина
  70.   endif
  71.  
  72.   for k = 2:d
  73.    D = diagSummation(1, k, D); % идем по параллельным диагоналям от главной на северо-восток
  74.    D = diagSummation(k, 1, D); % идем по параллельным диагоналям от главной на юго-запад
  75.   endfor
  76.  
  77.   min = D(1);
  78.   for i = D % ищем минимальный элемент среди D
  79.     if i < min
  80.       min = i;
  81.     endif
  82.   endfor
  83.  
  84.   printf('\n\n Минимум среди сумм элеметов диагоналей (кроме главной): %i\n\n', min);
  85.    
  86.    
  87.   %______________________________________
  88.  
  89.     function D = diagSummation(i, j, D) % суммируем элементы текущей диагонали
  90.       diag = 0;
  91.    
  92.       while j <= m && i <= n
  93.         diag += M(i, j);
  94.         % спускаемся по диагонали на один индекс вправо и вниз:
  95.         i += 1;  
  96.         j += 1;
  97.       endwhile
  98.       D(end+1) = diag;
  99.  
  100.     endfunction
  101.    
  102.   %______________________________________
  103.  
  104. endfunction
  105.  
  106.  
  107. function INDECIES = howManyNegativesI(M, n, m) % считаем количество отрицательных элементов первым способом
  108.   INDECIES = [];
  109.   k = 0;
  110.  
  111.   for i = 1:n
  112.     for j = 1:m
  113.       if M(i, j) < 0
  114.         k += 1;
  115.       endif
  116.     endfor
  117.     INDECIES(end+1) = k; % индекс массива INDECIES соответствует инедксу строки матрицы M: то есть на первом месте в массиве INDECIES стоит количество отрицательных элементов первой строки, на втором - второй строки и тд
  118.     k = 0;
  119.   endfor
  120.  
  121. endfunction
  122.  
  123.  
  124. function INDECIES = howManyNegativesII(M, n, m) % считаем количество отрицательных элементов вторым способом
  125.   INDECIES = [];
  126.   k = 0;
  127.  
  128.   for i = 1:n
  129.     for j = M(i, :)
  130.       if j < 0
  131.         k += 1;
  132.       endif
  133.     endfor
  134.     INDECIES(end+1) = k;
  135.     k = 0;
  136.   endfor
  137.  
  138. endfunction
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement