如何快速构建 MxMxN 张量?

How to build a MxMxN Tensor fast?

考虑等式 f=Axdim(f)=Mdim(A)=(M,N)dim(x)=N。导数 df/dA 是一个 MxMxN 张量,通过 dfi/dA = [0^T ... x^T ... 0^T]^T,i=1,...,M 定义,其中 x^T 的位置在 [= 的第 i 行19=].

在给定 xdfdA = zeros(M,M,N) 的情况下,您将如何快速构建该张量?我当前的方法是 for 循环:for i=1:M; dfdA(i,i,:) = x'; end。有什么建议吗?

我使用 kron 产品想出了另一种变体。我还比较了两个不同的目标;第一个专用于我们想要输出维度 [M x M x N] 的情况,第二个专用于我们想要 [M x (M*N)] 的情况。在这两种情况下,我们使用 for 循环的变体都优于其他变体。

clear all; close all; clc; rng(0);

M = 3;
N = 2;

A = rand(M,N);
x = rand(N,1);


objective = 2;  % [1]: dim(dfdA) = [M x M x N], [2]: dim(dfdA) = [M x (M*N)]
switch objective
    case 1
        tic;
        dfdA = zeros(M,M,N);
        for i = 1:M
            dfdA(i,i,:) = x';
        end
        toc;

        tic;
        dfdA = zeros(M,M,N);
        dfdA(bsxfun(@plus,(1:M+1:M*M)',(0:M^2:(N-1)*M^2))) = repmat(x',M,1);
        toc;

        tic;
        dfdA = kron(x',eye(M));
        dfdA = reshape(dfdA,M,M,N);
        toc;

    case 2
        tic;
        dfdA = zeros(M,M,N);
        for i = 1:M
            dfdA(i,i,:) = x';
        end
        dfdA = reshape(dfdA,M,M*N);
        toc;

        tic;
        dfdA = zeros(M,M,N);
        dfdA(bsxfun(@plus,(1:M+1:M*M)',(0:M^2:(N-1)*M^2))) = repmat(x',M,1);
        dfdA = reshape(dfdA,M,M*N);
        toc;

        tic;
        dfdA = kron(x',eye(M));
        toc;
end