Дублируйте каждую нечетную строку в массиве с помощью Matlab - PullRequest
0 голосов
/ 15 апреля 2019

В Matlab мне нужно продублировать каждую нечетную строку в массиве, исключая первую и последнюю, например:

g =  [5;    6;     11;     12;     17;   23;    24;     29;   30];

, код будет манипулировать им так:

g =  [5;     6;     11;    11;    12;    17;    17;   23;    24;   24;     29;   30]

Как я могу сгенерировать эту новую последовательность?

Ответы [ 3 ]

2 голосов
/ 16 апреля 2019

Есть грязный способ сделать этот массив. Я говорю, что это противно, потому что трудно читать, что происходит, пожалуйста, оставьте много комментариев об этом куске кода, если вы его используете!

Вы хотите создать набор индексов 1, 2, 3, 3, 4, 5, 5, 6, 7, 7, ..., повторяя нечетные (кроме 1, а также убедитесь, что последний не повторяется). Последовательность повторяющихся нечетных значений - это пол или последовательность 1, 2/3, 4/3, 6/3, 8/3, ..., которую легко сгенерировать: 1:2/3:N. Это создает последовательность 1, 1, 2, 3, 3, ..., нам нужно удалить первый элемент.

Оказывается (экспериментируя), что индекс N не повторяется, если N нечетно (по желанию), но пропускается, если N четно. Таким образом, мы генерируем последовательность индекса до N+1 и удаляем последний элемент. Таким образом, N не повторяется, если нечетное, но всегда присутствует.

Итак, мы имеем:

g =  [5; 6; 11; 12; 17; 23; 24; 29; 30]; % input data
indx = floor(1:2/3:numel(g)+1);          % indices with odd elements repeated
indx = indx(2:end-1);                    % remove first and last element
result = g(indx);                        % index
1 голос
/ 16 апреля 2019

Вы также можете сделать что-то подобное.

%Creating a vector f with double the number of elements
f = zeros(2*size(g,1),1)

%Insering an element of g into the even indices of f - odd indices are still zero
f(2:2:end+1) = g;

%Inserting an element of g into the odd indices of f - even indices already have the g values
f(1:2:end) = g;

%Remove every element from the second odd index
f(3:4:end) = [];

Edit 2:
There is also another way to use this.
n = 2; %number of times an odd element has to be repeated.
f = kron(g, ones(n*1,1)); % This is the Kronecker tensor product

f(3:4:end) = [];

This will also work. 
1 голос
/ 15 апреля 2019

Вы можете сделать что-то вроде этого:

g =  [5; 6; 11; 12; 17; 23; 24; 29; 30];
n = size(g, 1);

f(1,:) = g(1,:);
for i = 2:(n-1)
   if mod(i,2) == 1
       f = [f; g(i,:)];
       f = [f; g(i,:)];
   else
       f = [f; g(i,:)];
   end
end
f = [f; g(n,:)];

где f - ваша новая матрица.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...