2015-10-10 79 views
0

是否有一種簡單的(非for循環)方法來創建八度模型矩陣。在R我使用model.matrix()來做到這一點。八度模型矩陣

我有此數組:

array = [1;2;3;2] 

,我需要(對於迴歸的原因)

*(model = [1 0 0 0; 0 1 0 1; 0 0 1 0])* EDIT on my side 
result is this model (colum 1 is for 1, column 2 for the two's etc.: 
model = [1 0 0 ; 0 1 0 ; 0 0 1 ; 0 1 0] 

我可以循環使用做到這一點:

model = zeros(4,3); 

for i=1:4 
model(i,array(i)) = 1; 
end 

但它會很高興做到這一步就像這樣:

model = model.matrix(array) 

我能比它包含在公式中馬上

回答

1

你需要把你的價值觀轉換成線性指標,像這樣:

octave:1> array = [1 2 3 2]; 
octave:2> model = zeros ([numel(array) max(array)]); 
octave:3> model(sub2ind (size (model), 1:numel(array), array)) = 1 
model = 

    1 0 0 
    0 1 0 
    0 0 1 
    0 1 0 

因爲你的矩陣將是非常稀疏,一個可能的優化來創建一個稀疏矩陣。

octave:4> sp = sparse (1:numel(array), array, 1, numel (array), max (array)) 
sp = 

Compressed Column Sparse (rows = 4, cols = 3, nnz = 4 [33%]) 

    (1, 1) -> 1 
    (2, 2) -> 1 
    (4, 2) -> 1 
    (3, 3) -> 1 

octave:5> full (sp) 
ans = 

    1 0 0 
    0 1 0 
    0 0 1 
    0 1 0 

這將花費很少的內存,但許多功能將無法處理它們並將它們轉換爲完整的矩陣。所以這是否值得取決於你下一步要做什麼。

+0

謝謝,挺有意思的。如果我轉置和鏡像「模型」,我得到我所需要的。但我仍然有2步的過程。我希望能夠一次完成所有優化的代碼。我可以編寫一個具有輸入數組並輸出「model」的函數:function [model] = model.matrix(array).... end。但是優化的代碼通常在巨大的競爭中更好更快地工作。 – irJvV

+0

@irJvV你是什麼意思優化?這已經非常優化了,它返回了你在問題中描述的矩陣。您不必轉置模型,只需將參數交換到'sub2ind()'。 – carandraug

+0

感謝您的回覆。我在結果「模型」中犯了一個錯誤 - >結果應該是model = [1 0 0; 0 1 0; 0 0 1; 0 1 0](我會編輯這個問題),但從你的函數模型transopse我會有這樣的模型'如此完美。通過優化代碼,我的意思是說,作爲核心Octave一部分的代碼通常比您自己編寫的類似代碼更快速和更穩定,並且它使用了一個簡單的參數(模型'比我自己編寫轉換的任何代碼都更好所有在一個'。我喜歡Octave很多級聯功能前衛與矩陣計算:) – irJvV