Matlab: создание матрицы, строки которой состоят из linspace или аналогичного шаблона

Кто-нибудь знает быстрый способ создать матрицу, состоящую из linspace для каждой строки? Например, тип шаблона, который я ищу в этой матрице:

1 2 3 4 5 6 7 8 9 10
1 2 3 4 5 6 7 8 9 10
1 2 3 4 5 6 7 8 9 10
...
1 2 3 4 5 6 7 8 9 10

Кто-нибудь знает какие-нибудь быстрые трюки для создания этого БЕЗ использования цикла for?


person slam_duncan    schedule 20.09.2014    source источник


Ответы (5)


Я только что понял это, так что на случай, если кого-то еще это беспокоит, мы можем добиться этого точного шаблона:

a=linspace(1,10,10);
b=ones(3,1)*a;

Это даст:

>> a = 1 2 3 4 5 6 7 8 9 10

>> b = 1 2 3 4 5 6 7 8 9 10
       1 2 3 4 5 6 7 8 9 10
       1 2 3 4 5 6 7 8 9 10
person slam_duncan    schedule 20.09.2014

Вам нужно использовать repmat.

Пример:

>> B = repmat(1:10,[3 1])

B =

     1     2     3     4     5     6     7     8     9    10
     1     2     3     4     5     6     7     8     9    10
     1     2     3     4     5     6     7     8     9    10

Вы можете изменить значение 3 там. Вы можете изменить его соответствующим образом.

person lakesh    schedule 20.09.2014

Другой ярлык, который я могу порекомендовать, похож на repmat, но вы указываете базовый массив первым из a = 1:10;. Как только вы это сделаете, вы указываете ряд 1 в первом измерении при индексировании, которое должно создавать матрицу из тех же векторов с таким количеством строк, как вы хотите, где каждая строка состоит из базового массива a. Как таковой:

%// number of times to replicate
n = 4;
a = 1:10;
a = a(ones(1,n),:);

Результат:

a =

 1     2     3     4     5     6     7     8     9    10
 1     2     3     4     5     6     7     8     9    10
 1     2     3     4     5     6     7     8     9    10
 1     2     3     4     5     6     7     8     9    10
person rayryeng    schedule 20.09.2014

Вставьте эту команду: transpose(ndgrid(1:10,1:n));, где n — количество строк, желаемых в результате.

person Robert    schedule 20.09.2014
comment
хорошо, где n - количество строк - person Robert; 20.09.2014

Вы можете рассмотреть следующие решения:

  1. С базовой матричной индексацией (взято из здесь)

    b=a([1:size(a,1)]' * ones(1,NumToReplicate), :)  %row-wise replication
    b=a(:, ones(NumToReplicate, 1))  %column-wise replication
    
  2. С bsxfun:

     bsxfun(@times,a,(ones(1,NumToReplicate))')  %row-wise replication
     bsxfun(@times,a',(ones(1,NumToReplicate)))  %column-wise replication
    

Вы можете протестировать два вышеуказанных решения с помощью repmat.

person Autonomous    schedule 20.09.2014
comment
Хотя я очень люблю bsxfun, в данном случае это не очень хороший пример использования. - person Shai; 21.09.2014