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”时,我必须更改第 3 维和第 4 维的顺序,然后传递 G 的转置,但这似乎完全违反直觉,因为原始“Correl_beta”和原始(未转置)中的最后两个维度) “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
4

1 回答 1

1

要根据需要重塑矩阵,

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

这将第 4 个维度(大小为 10)带到第一个维度,将第 3 个维度(大小为 4)带到第二个维度。

在你的循环中,两者都j循环k通过1:51,所以前两个维度Correl_betas最终也将是长度 51。

于 2013-10-29T15:31:31.657 回答