2016-07-12 3 views
0

У меня есть вектор-столбец A с размерами (35064x1), который я хочу переделать в матрицу с 720 строками и столько столбцов, сколько нужно.Как преобразовать неквадратичную матрицу?

В MATLAB, это было бы что-то вроде этого:

B = reshape(A,720,[]) 

, в котором B моя новая матрица.

Однако, если я делю 35604 на 720, там будет остаток.

В идеале MATLAB будет заполнять каждый столбец значениями 720 до последнего столбца, который не имеет значений 720; скорее, 504 значения (48x720 + 504 = 35064).

Есть ли какая-либо функция, как reshape, которая выполнит эту задачу?

Поскольку я плохо разбираюсь в кодировании, я сначала прибегаю к встроенным функциям, прежде чем переходить к программированию.

ответ

3

reshape сохраняет число элементов, но вы достичь того же в двух шагах

b=zeros(720*ceil(35604/720),1); b(1:35604)=a; 
reshape(b,720,[]) 
+1

правильная идея, но неверный код. 'zero (4)' создает матрицу 4x4. – Daniel

+0

есть, правый. исправлено. – karakfa

0
A = rand(35064,1); 
NoCols = 720; 
tmp = mod(numel(A),NoCols); % get the remainder 
tmp2 = NoCols -tmp; 
B = reshape([A; nan(tmp2,1)],720,[]); % reshape the extended column 

Это первый получает остаток от деления, а затем вычесть, что из числа столбцов, чтобы найти сумму отсутствующие значения. Затем создайте массив с nan (или нулями, в зависимости от вашей цели), чтобы наложить оригинал, а затем reshape. Один лайнер:

A = rand(35064,1); 
NoCols = 720; 
B = reshape([A; nan(NoCols-mod(numel(A),NoCols);,1)],720,[]); 
0

karakfa получил правильную идею, но некоторые ошибки в его коде.

Исправление ошибок и немного упростить его, вы в конечном итоге с:

B=nan(720,ceil(numel(a)/720)); 
B(1:numel(A))=A; 

Создать матрицу, где А соответствует в и assingn в elemnent от А до первого numel (А) элементов матрицы.

Альтернативная реализация, которая, вероятно, немного быстрее, но манипулирует вашей переменной b

%pads zeros at the end 
A(720*ceil(numel(A)/720))=0; 
%reshape 
B=reshape(A,720,[]); 
Смежные вопросы