如何快速构建 MxMxN 张量?
How to build a MxMxN Tensor fast?
考虑等式 f=Ax
和 dim(f)=M
、dim(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=].
在给定 x
和 dfdA = 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
考虑等式 f=Ax
和 dim(f)=M
、dim(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=].
在给定 x
和 dfdA = 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