#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
?