考虑具有dim(f)=M、dim(A)=(M,N)和dim(x)=N的方程f=Ax。导数df/dA是一个MxMxN张量,并通过dfi/dA = [0^T ... x^T ... 0^T]^T,与i=1,...,M一起定义,从而x^T的位置在dfi/dA的第i行。
如何在给定x和dfdA = zeros(M,M,N)情况下快速构建张量?我目前的方法是一个for循环:for i=1:M; dfdA(i,i,:) = x'; end。有什么建议吗?
发布于 2018-08-09 21:25:15
通过使用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;
endhttps://stackoverflow.com/questions/51760090
复制相似问题