如何创建一个四维(从向量)矩阵并重置它的下三角形'

时间:2016-11-29 10:08:07

标签: matlab

我试图从矢量中获取一个4维矩阵然后重置它 降低triangel'。 例如,如果我的原始向量是二维的:A = [1 2]'那么我想我的初始矩阵是:

C(:,:,1,1) = [1*1*1*1 1*1*1*2 ; 1*1*2*1 1*1*2*2] = [ 1 2 ; 2  4]
C(:,:,2,1) = [2*1*1*1 2*1*1*2 ; 2*1*2*1 2*1*2*2] = [ 2 4 ; 4  8]
C(:,:,1,2) = [1*2*1*1 1*2*1*2 ; 1*2*2*1 1*2*2*2] = [ 2 4 ; 4  8]
C(:,:,2,2) = [2*2*1*1 2*2*1*2 ; 2*2*2*1 2*2*2*2] = [ 4 8 ; 8 16]

所以C是:

C(:,:,1,1) = [ 1 2 ; 2  4]  C(:,:,2,1) = [ 2 4 ; 4  8]
C(:,:,1,2) = [ 2 4 ; 4  8]  C(:,:,2,2) = [ 4 8 ; 8 16]

重置后我希望它是:

C(:,:,1,1) = [ 1 2 ; 2  4]  C(:,:,2,1) = [ 0 0 ; 0  0]
C(:,:,1,2) = [ 0 0 ; 4  8]  C(:,:,2,2) = [ 0 0 ; 8 16] 
我不想重复行。

我尝试了以下代码:

A = [1 2]';
C = bsxfun(@times, permute(C, [4 3 2 1]), C*C');
disp('C before reset is:');
disp(C);

for k = 2:size(C, 4)
  C(1:k-1,:,k) = 0;
end

disp('C after reset is:');
disp(C);
disp('The size of C is:');
disp(size(C)); 

但输出是:

BB before reset is:
(:,:,1,1) =
     1     2
     2     4
(:,:,1,2) =
     2     4
     4     8
C after reset is:
(:,:,1,1) =
     1     2
     2     4
(:,:,1,2) =
     0     0
     4     8
The size of BB is:
     2     2     1     2

我错过了什么? 我想我不明白这条线的背后是什么:

C = bsxfun(@times, permute(C, [4 3 2 1]), C*C');

行[4 3 2 1]中每个数字的含义是什么?

谢谢!

编辑注释:矩阵表示神经元之间的相关性。我试图看看4个神经元组的相关结构。因此,每4个神经元只能被测量一次。我认为复位前的矩阵包含4个!时间,每组4个,因为他们在所有订单中都是apear。我可以这样离开,但我认为这可能会减慢程序..

1 个答案:

答案 0 :(得分:1)

Permute交换尺寸,例如

C = [1:3;4:6];

permute(C, [2 1])

通过交换行和列来计算简单的转置。 [2 1]参数表示C的第2维和第1维映射到结果中的第1维和第2维。每个'新'维度按顺序指定。因此[3 2 1]会将第3,第2和第1维度作为新的第1,第2和第3维度。

permute(C, [3 2 1])

ans =

ans(:,:,1) =

   1   2   3

ans(:,:,2) =

   4   5   6

在结果中第3维= 1的位置找到行{1的C元素。类似地,在结果中第3维= 2的位置找到C的行= 2的元素。

仍然可以找到列数为1的C元素,其中结果中列= 1(依此类推),因为列维度已映射到自身。

结果的行是有趣的维度,由于C没有第三维,因此它是单例(即只有一行)。

解决问题的第一部分,可以通过

获取C的正确输出
A = [1 2]'*[1 2];
C = bsxfun(@times, permute(A, [4,3,1,2]), A);

我需要更多关于你想要最终行为的信息('重置下三角形'),因为我不清楚你想要什么。

可能对您有用的函数是triu函数,它提取矩阵的上三角分量。