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 loop บ้างไหม?


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; เมื่อคุณทำเช่นนี้ คุณจะต้องระบุชุดของ 1s ในมิติแรกเมื่อทำการจัดทำดัชนี ซึ่งควรสร้างเมทริกซ์ของเวกเตอร์เดียวกันที่มีหลายแถวตามที่คุณต้องการ โดยแต่ละแถวประกอบด้วยอาร์เรย์ฐาน 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