Matlab: membuat matriks yang baris-barisnya terdiri dari linspace atau pola serupa

Adakah yang tahu cara cepat menghasilkan matriks yang terdiri dari linspace untuk setiap baris? Misalnya, pola yang saya cari dalam matriks ini adalah:

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

Adakah yang tahu trik cepat untuk menghasilkan ini TANPA menggunakan for loop?


person slam_duncan    schedule 20.09.2014    source sumber


Jawaban (5)


Saya baru saja menemukan jawabannya, jadi kalau-kalau ada orang lain yang merasa terganggu dengan hal ini, kita dapat mencapai pola yang tepat ini dengan:

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

Ini akan memberi:

>> 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

Anda perlu menggunakan repmat.

Contoh:

>> 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

Anda dapat memvariasikan nilai 3 di sana. Anda dapat mengubahnya sesuai kebutuhan.

person lakesh    schedule 20.09.2014

Pintasan lain yang dapat saya rekomendasikan mirip dengan repmat, tetapi Anda menentukan array dasar terlebih dahulu dari a = 1:10;. Setelah Anda melakukan ini, Anda menentukan rangkaian 1 di dimensi pertama saat mengindeks yang akan menghasilkan matriks dengan vektor yang sama dengan banyak baris yang Anda inginkan, di mana setiap baris terdiri dari larik dasar a. Dengan demikian:

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

Hasil:

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

Masukkan perintah ini: transpose(ndgrid(1:10,1:n));, dimana n adalah jumlah baris yang diinginkan pada hasil.

person Robert    schedule 20.09.2014
comment
dimana n adalah jumlah baris - person Robert; 20.09.2014

Anda dapat mempertimbangkan solusi berikut:

  1. Dengan pengindeksan matriks dasar (diambil dari di sini)

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

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

Anda dipersilakan untuk membandingkan dua solusi di atas dengan repmat.

person Autonomous    schedule 20.09.2014
comment
Meskipun saya sangat menyukai bsxfun, dalam hal ini ini bukan contoh penggunaan yang baik. - person Shai; 21.09.2014