【问题标题】:How to sum a sub-tensor of high dimention tensor in Matlab?如何在Matlab中对高维张量的子张量求和?
【发布时间】:2026-01-13 16:30:01
【问题描述】:

给定一个 D 维张量,表示为大小为 n^D 的向量。

向量表示随机变量 X \in {0,1,..,n}^d 的 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) 的向量 x,第一个维度等于 1 的概率为

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 不够熟悉,无法以简单的方式完成(使用一些丑陋的递归是可行的,但必须有更好的选择)。

【问题讨论】:

    标签: matlab vector multidimensional-array


    【解决方案1】:

    要为 D 维矩阵计算 P(X_k=z),您可以使用

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

    它首先使它成为一个D维矩阵。它将感兴趣的维度k 带到开头,然后选择z-th 元素并对与之对应的元素求和。

    【讨论】:

      【解决方案2】:

      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));
      

      【讨论】: