2015-10-07 182 views
0

我需要編寫將行向量轉換爲矩陣的代碼。舉例來說,如果我有a = 1 2 3 4 5 6 7 8 9,我想矩陣爲:將行向量轉換爲矩陣

m = [1 2 3; 
    4 5 6; 
    7 8 9] 

我有這一點,這是行不通的。任何人都可以幫助我嗎?

for i=1:length(a) 
    m = a(i); 
    i = i + 1; 
end 

而且,我不允許使用任何Matlab的內置函數(如reshape)。

+1

我不能使用vec2mat或者重塑 –

+1

如果你的向量是1x8,矩陣是2x4還是4x2?或者它只適用於3x3?如果你創建一個你想要的結果大小爲零的矩陣(例如,'A =零(3,3)'),那麼你可以做'A(:)= a'。你將不得不檢查元素是否在矩陣的正確位置。 – David

+1

發佈家庭作業通常不太好,但是當你展示你已經嘗試過的時候,+1 =)看看Shai對你的問題的編輯(你可以點擊「編輯x分鐘前」鏈接)。你的原始循環不是很漂亮=) –

回答

4

使用重塑

a = [1 2 3 4 5 6 7 8 9]; 
A = reshape(a, 3, [])' 

,其中第三個參數自動拍攝(的cols數)

或者,如果你不能使用任何MATLAB建立在功能使用這種這裏

A = zeros(3,3); %// or A(3,3) = 0 by thewaywewalk (thank you) 
A(:) = a; 
A = A'; 
+0

我不能使用任何MATLAB函數。 –

+2

如果'zeros'也是一個禁止函數,你可以使用'A(3,3)= 0'來進行預分配。 – thewaywewalk

+0

@thewaywewalk是否有任何情況下'零(N,M)'實際上優於'A(N,M)= 0;'?零點當然更安全,因爲這不會修改現有的變量。但是,如果你處於這種情況,你仍然非常煩惱。 – patrik

3

當然,使用reshape是將矢量轉換爲矩陣的正確方法。
然而,因爲你不希望使用任何Matlab的功能,你可以使用一個循環

A = zeros(3,3); %// preallocate 
for ii=1:3, 
    A(ii,:) = a((ii-1)*3 + 1:3); %// put one row into place 
end 

,或者更一般地說,如果你想重塑一個H * W載體引入H -by- W矩陣:

A = zeros(H,W); 
for ii=1:H 
    A(ii, :) = a((ii-1)*W + 1:W); 
end 

PS,
注意,最好是not to use i as a variable name in Matlab