Преобразование вектора в большую матрицу с произвольными m и n - PullRequest
1 голос
/ 17 января 2020

Я пытаюсь создать функцию, которая берет вектор любой длины и использует его записи для генерации матрицы размера mxn, где m и n - произвольные числа. Если матрица имеет большее количество записей, чем исходный вектор, записи должны повторяться. Например, вектор, (1,2,3,4) будет составлять матрицу 3x3 (1,2,3; 4,1,2; 3,4,1).

Пока у меня есть эта функция :

function A = MyMatrix(Vector,m,n)

A = reshape([Vector,Vector(1:(m*n)-length(Vector))],[m,n]);

end

, что в некоторых случаях успешно:

>> m=8;n=5;Vector=(1:20);
>> A = MyMatrix(Vector,m,n)

A =
     1     9    17     5    13
     2    10    18     6    14
     3    11    19     7    15
     4    12    20     8    16
     5    13     1     9    17
     6    14     2    10    18
     7    15     3    11    19
     8    16     4    12    20

Однако это работает только для значений m и n, которые умножаются на число, меньшее или равное удвоенному числу записей в «Вектор», так что 40 в этом случае. Когда mn больше 40, этот код выдает:

>> m=8;n=6;Vector=(1:20);
>> A = MyMatrix(Vector,m,n)
Index exceeds the number of array elements (20).

Error in MyMatrix (line 3)
A = reshape([Vector,Vector(1:(m*n)-length(Vector))],[m,n]);

Я пытался создать обходной путь, используя такие функции, как repmat, однако до сих пор я не смог создать матрицу с большей м и н.

1 Ответ

2 голосов
/ 17 января 2020

Вам нужно всего лишь

  • индексировать вектор, используя " modular ", индексирование на основе 1;
  • изменить , принимая Учтите, что Matlab Major-column , поэтому вам необходимо поменять местами m и n;
  • , переставить , поменять местами m и n назад.

V = [10 20 30 40 50 60]; % vector
m = 4; % number of rows
n = 5; % number of columns
A = reshape(V(mod(0:m*n-1, numel(V))+1), n, m).';

Это дает

A =
    10    20    30    40    50
    60    10    20    30    40
    50    60    10    20    30
    40    50    60    10    20
...