Сгенерируйте конкретную матрицу в режиме онлайн

#matlab

Вопрос:

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

Это первая матрица

Первая матрица

И это вторая матрица:

Вторая матрица

Редактировать: Домашнее задание было бы забавно…фон: Я пытаюсь реализовать простой алгоритм изменения размера изображения. Наконец, я хочу использовать генератор кодов для создания соответствующего кода на языке Си. Это текущая реализация:

 function [ J ] = resize( I, sc ) %#codegen

% Function implements an algorithm to scale down given image 'I' by factor 'sc':
%
% Input data description:
% I : Grayscale 2-dimensional image
% sc: Image scale factor [-]

% -------------------------------------------------------------------------
assert( isa( I , 'uint8' ) );
assert( isa( sc, 'uint8' ) );
assert( ( sc >= 0 ) amp;amp; ( sc <= 10 ) );

% Calculate scaled image size [pixel]:
ns = uint8( fix( size( I ) / single( sc ) ) );
nr = ns( 1 );
nc = ns( 2 );

% Number of elements within window:
nw = sc * sc;

% Resulting image:
J = zeros( ns, 'uint8' );

% Create index lookup table to access windows within 'I':
ri = reshape( 1 : sc * nr, sc, nr );
ci = reshape( 1 : sc * nc, sc, nc );

% Loop over image 'I' and calculate mean for each window 'w' of size [sc sc]:
% coder.unroll( );
for c = 1 : nc
%   coder.unroll( );
    for r = 1 : nr
        % Extract window 'I_w' of fixed size [sc sc] from image 'I': 
        I_w = I( ri( :, r ), ci( :, c ) );
            
        % Calculate mean of window 'I_w':
        s = uint16( 0 );
%       coder.unroll( );
        for i = 1 : nw
            s = s   uint16( I_w( i ) );
        end
        J( r, c ) = s / uint16( nw );                
    end
end
 

Это хорошо работает. При I=[120 160], sc=6 я получаю:

   /* MATLAB Function: '<S4>/Resize' */
  for (loop_ub = 0; loop_ub < 26; loop_ub  ) {
    for (r = 0; r < 20; r  ) {
      s = 0U;
      for (nz = 0; nz < 36; nz  ) {
        s = (uint16_T)((uint32_T)rtu_I[((ci[loop_ub * 6   nz / 6] - 1) * 120  
          ri[r * 6   nz % 6]) - 1]   s);
      }

      z = (uint16_T)(s / 36U);
      s = (uint16_T)((uint32_T)s - (uint16_T)(z * 36U));
      if ((s > 0) amp;amp; (s >= 18)) {
        z  ;
      }

      rtb_I_sc[r   20 * loop_ub] = (uint8_T)z;
    }
  }
 

Переменные ci, ri предварительно вычисляются генератором кода и массивами const в коде C. Неплохо. Вычисление индекса изображения по-прежнему сопряжено с большими накладными расходами:

  s = (uint16_T)((uint32_T)rtu_I[((ci[loop_ub * 6   nz / 6] - 1) * 120   ri[r * 6   nz % 6]) - 1]   s);
 

Теперь моя идея состояла в том, чтобы предварительно вычислить все необходимые показатели:

 % Create index lookup table to access windows within 'I':
% ri = repelem( reshape( 1 : sc * nr, sc, [] ), sc, 1 );
% ri = repmat( ri, 1, nr );
% 
% ci = repelem( reshape( 1 : sc * nc, sc, [] ), 1, nc );
% ci = repmat( ci, sc, 1 );
% 
% id = sub2ind( size( I ), ri(:), ci(:) );
% 
% id = reshape( id, N, [] );
% 
% % Loop over image 'I' and calculate mean for each window 'w' of size [sc sc]:
% for c = 1 : nc
%     for r = 1 : nr
%         % Extract window 'I_w' of fixed size [sc sc] from image 'I': 
%         I_w = I( id( :, r * c ) );
%             
%         % Calculate mean of window 'I_w':
%         s = uint16( 0 );
%         for i = 1 : N
%             s = s   uint16( I_w( i ) );
%         end
%         J( r, c ) = s / uint16( N );                
%     end
% end
 

Приведенный выше код вообще не работает должным образом, но главная проблема заключается в том, что показатели не рассчитаны заранее. Реализация кажется слишком сложной для генератора кода. Поэтому я искал какие-то волшебные команды изменения формы (какие угодно) для настройки таблиц поиска.

Комментарии:

1. Почему одна строчка? Звучит как нелепое требование. В любом случае, вам вообще удалось сгенерировать эти матрицы? Пожалуйста, покажите нам, как далеко вы продвинулись. Мы не хотим делать за вас домашнюю работу.

2. Подсказка: это можно сделать с помощью добавления с неявным расширением и repelem

3. Это может быть более по теме, как tips вопрос в codegolf.stackexchange.com . Но, как говорит Крис, покажите свою попытку

4. Итак, теперь возникает вопрос: почему вы не используете imresize ?