2015-12-18 3 views
-2

Какой наиболее эффективный способ сборки вектора v в матрицу A, как показано ниже? (Без использования для циклов).Соберите вектор в 2D-матрицу

Вход:

v = [1;2;3;4;5;6;7;8;9]

Желаемая выход матрица:

A = 
    1  0  0 
    2  0  0 
    3  0  0 
    0  4  0 
    0  5  0 
    0  6  0 
    0  0  7 
    0  0  8 
    0  0  9 
+1

Это может быть решено так много способов. Нам нужно посмотреть, как ваша проблема масштабируется, чтобы определить «наиболее эффективное» решение. – learnvst

ответ

1

Вот один из способов: создать матрицу из нулей, а затем определить linear index с позицией, где вектор значение будет написанное:

v = [1;2;3;4;5;6;7;8;9]; %// data vector 
n = 3; %// group size 

N = numel(v); 
A = zeros(N, N/n); %// define A filled with zeros 
A(bsxfun(@plus, reshape((1:N).',n,[]), (ceil(1:N/n)-1)*N)) = v; %'// fill in v with 
    %// linear indexing 

Результата в этом примере:

A = 
    1  0  0 
    2  0  0 
    3  0  0 
    0  4  0 
    0  5  0 
    0  6  0 
    0  0  7 
    0  0  8 
    0  0  9 
1

Один подход с использованием дополнения нулей и изменения формы -

m = 3;   %// To select group of "m" elements from v for each col in o/p 
N = numel(v); %// Number of elements in input vector 

%// Reshape, pad with zeros 
vpad = [reshape(v,m,[]) ; zeros(N,N/m)] 

%// Clip off at "N*N/m" elements and reshape into 2D array with N rows 
A = reshape(vpad(1:N*N/m),N,[]) 

Пример запуск -

v = 
    31 19 46 82 57 10 36  5 46 39 90 74 
m = 
    4 
A = 
    31  0  0 
    19  0  0 
    46  0  0 
    82  0  0 
    0 57  0 
    0 10  0 
    0 36  0 
    0  5  0 
    0  0 46 
    0  0 39 
    0  0 90 
    0  0 74 
+0

Вы не могли использовать 'bsxfun' на этом: -P –

+0

@ LuisMendo Nah Я так и не собирался :) – Divakar

+0

@ LuisMendo Ах, извините моя вина! индексация с линейными индексами в этих разреженных местах была бы наиболее эффективной здесь! Таким образом, это должно быть самым быстрым способом, каким вы это сделали. – Divakar

Смежные вопросы