Как инициализировать вектор в MATLAB по шаблону? - PullRequest
1 голос
/ 28 сентября 2011

Я совершенно новичок в MATLAB. Это может быть довольно простой вопрос.

Учитывая числовые значения для size, extras и max, мне нужно инициализировать вектор 1 XN таким образом, чтобы первые size элементы были 1, следующие size равны 2, следующие size равны 3 и так до тех пор, пока последние size элементов не будут установлены на max. Поэтому мне нужно последовательно инициализировать size количество элементов до x, чтобы x увеличивалось с 1 до max. Экстры - это количество оставшихся ячеек, которые инициализируются в 0. Для иллюстрации:

size = 3; %# (is same as the quotient of N/max)
extras = 1; %# (is same as remainder of N/max) 
max = 3; 
N = 10;

original_vector = [0 0 0 0 0 0 0 0 0 0];

Желаемый вывод -

Required_vector = [1 1 1 2 2 2 3 3 3 0]

Ответы [ 4 ]

1 голос
/ 28 сентября 2011

Может быть, что-то с использованием продукта Kronecker:

N = 10;
max = 3;
extras = rem(N, max);
size = floor(N/max);

v = [kron([1 : max], ones(1,size)) zeros(1, extras)];

Я предположил, как рассчитываются дополнительные и размер.Вы сказали, что размер - N% max, а дополнительные - N rem max, но это одно и то же (?).

1 голос
/ 28 сентября 2011

Некоторые изменения акробатики должны сделать это:

>> size = 3;
>> max = 3;
>> N = 10;
>> v = zeros(1, N);
>> v(1:size*max) = reshape(cumsum(ones(max, size))', size*max, 1)

v =

     1     1     1     2     2     2     3     3     3     0

Другой пример:

>> size = 4;
>> max = 5;
>> N = 23;
>> v(1:size*max) = reshape(cumsum(ones(max, size))', size*max, 1)

v =

  Columns 1 through 18

     1     1     1     1     2     2     2     2     3     3     3     3     4     4     4     4     5     5

  Columns 19 through 23

     5     5     0     0     0
0 голосов
/ 28 сентября 2011

Небольшая модификация решения @ b3 :

N = 10;
mx = 3;

sz = floor(N/mx);
v = zeros(1,N);
v(1:mx*sz) = repmat(1:mx,sz,1)
0 голосов
/ 28 сентября 2011

Это довольно грязная реализация, но, поскольку вы говорите, что вы новичок в MATLAB, возможно, вам было бы лучше узнать, как вы можете более или менее грубо форсировать решение. Хитрость здесь в том, чтобы сделать ссылку на индекс в Vec, чтобы разместить числа. Я проигнорировал дополнительные параметры и вместо этого заполнил вектор как можно лучше с элементами

N = 23;
max = 3;
size = 4;

Vec = zeros(N,1);
for i=1:max
    for j=1:size
       Vec((i-1)*size +1 + (j-1)) = i;
    end
end

Vec'
extra = sum(Vec==0)

Выход: ans =

1  1  1  1  2  2  2  2  3  3  3  3  0  0  0  0  0  0  0  0  0  0  0

дополнительно =

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