2013-10-29 39 views
0

在下面的代碼中,「G」返回一個(10 * 4)矩陣,其方向正確。在正確的方向上輸入四維數組中的元素

我想要的就是能夠查看/調用由(j,k)索引的這些(10 * 4)矩陣。但是,當我將矩陣「G」存儲在4-D矩陣「測試」中時,數據顯示的方式有點不直觀?當我看到測試的變量編輯我得到:

val(:,:,1,1) =

1

val(:,:,2,1) =

0

val(:,:,3,1) =

0

val(:,:,4,1) =

0 。 。 。 val(:,:,1,10) =

1

val(:,:,2,10) =

0

val(:,:,3,10) =

0

val(:,:,4,10) =

0

因此,所有的數據是存在的,但我希望它顯示在一個10 * 4矩陣?

同樣,你會看到我必須更改「Correl_betas」的代碼並轉置「G」才能到達上面的位置。但是我覺得我是通過玩弄而不是我認爲代碼應該做的。爲什麼原始代碼不起作用?當聲明「Correl_betas」然後通過G的轉置時,我不得不改變第三和第四維的順序,但是這似乎完全違反了原始「Correl_betas」和原始(未轉置)的最後兩個維度)「G」也匹配?但是當我這樣做時,排序似乎比我想要的10 * $矩陣更遠。

所以我有2個問題?

1.)我怎樣才能到達我想從哪裏獲得j,k索引的二維(10 * 4)矩陣?

2.)上面的原始代碼怎麼沒有導致最後兩列產生(10,4)矩陣?

問題的一大部分是,我對使用超過2維的矩陣的工作經驗很少,所以如果這個問題顯示缺乏理解,那麼很抱歉。也許一個關於如何解釋操作更高維矩陣的上帝教程指針也會有所幫助。

%Correl_betas=zeros(50,50,10,4); 
Correl_betas=zeros(50,50,4,10); 
mats=[1:10]'; 
L1=-1; 

for j=1:51 

    L1=L1+1; 
    L2=-1; 

    for k=1:51 

     L2=L2+1; 
     lambda=[ L1; L2 ]; 
     nObs=size(mats,1); 

     G= [ones(nObs,1) (1-exp(-mats./lambda(1)))./(mats./lambda(1)) ((1-exp(-mats./lambda(1)))./(mats./lambda(1))-exp(-mats./lambda(1))) ((1-exp(-mats./lambda(2)))./(mats./lambda(2))-exp(-mats./lambda(2)))]; 




    %Correl_betas(j,k,:,:)=G; 
    Correl_betas(j,k,:,:)=G'; 

    test=Correl_betas(j,k,:,:); 

    temp1=corrcoef(Correl_betas(j,k,:,2),Correl_betas(j,k,:,3),'rows','complete'); 
    temp2=corrcoef(Correl_betas(j,k,:,2),Correl_betas(j,k,:,4),'rows','complete'); 
    temp3=corrcoef(Correl_betas(j,k,:,3),Correl_betas(j,k,:,4),'rows','complete'); 

    F2_F3(j,k)=temp1(1,2); 
    F2_F4(j,k)=temp2(1,2); 
    F3_F4(j,k)=temp3(1,2); 


end 

end 
+0

你也可以找到'squeeze'函數有幫助。 – Frederick

回答

1

重塑基質如所期望,

val2 = permute(val,[4 3 2 1]); 

這帶來的第四尺寸(10尺寸)到所述第一和第三維(4尺寸)到所述第二。

在你的循環中,jk都循環通過1:51,所以Correl_betas的前兩個維度最終也會變成長度51。

+0

啊,這是偉大的矩陣顯示在正確的方向吧!我已經回到原來的代碼了,因爲現在轉換似乎是多餘的(正如我認爲的那樣)。測試= Correl_betas(J,K,:,:); test2 = permute(test,[3 4 1 2]);唯一的問題是「test2」是一個純粹的10 * 4矩陣,應該包含j&k的第3和第4列是多餘的。是可以如此相同的事情,但保持j和k的索引? – Bazman

+1

是的,這是完美的! – Bazman

相關問題