2014-10-01 78 views
1

我們給出了一個D維張量,表示爲一個大小爲n^D的向量。如何在Matlab中求和高維張量的子張量?

該向量表示在{0,1,...,n}^d中隨機變量X \的D維分佈。這就是張量中的(i_1,i_2,...,i_d)項表示X_1 = i_1,X_2 = i_2,... X_d = i_d的概率。

我需要爲每個維度d和值i \ in [n]計算邊際分佈P(X_d = i)。即,這意味着P(X_d = i)的答案是向量的n ^(D-1)個條目的和。

例如,如果d = 2和n = 4,我們有大小(16,1)和所述第一尺寸等於1的概率的向量x是

P(X_1 = 1)= X(1)+ X(2)+ X(3)+ X(4)

所述第二尺寸等於3的概率是'

P(X_2 = 3)= x(3)+ x(7)+ x(11)+ x(15)

我正在編寫需要計算這些邊際分佈的Matlab代碼,但我對Matlab不夠熟悉,不能用簡單的方法來完成它(使用一些醜陋的遞歸是可行的,但必須有更好的方法選項)。

回答

2

爲了計算P(X_k=z)用於D維矩陣可以使用

xD = reshape(x, n*ones(1,D)); 
B = permute(xD, [k setdiff(1:D, k)]); 
P = sum(B(z,:)); 

它第一次它是一個D維度矩陣。它將感興趣的維度k帶到開頭,然後選擇第z個元素並對與其對應的元素求和。

+1

+1我覺得這是要走的路 – 2014-10-01 15:20:21

+0

太棒了,謝謝! – 2014-10-01 15:24:26

0

Mohsen Nosratinia's answer將是我的第一選擇。作爲替代方案,它可以在不重塑或置換的尺寸來完成,這可以導致更快的代碼:

k = 2; %// chosen dimension 
z = 3; %// chosen value (along d-th dimension) 
result = sum(x(mod(floor((0:end-1)/n^(k-1)), n)==z-1));