首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何快速构建MxMxN张量?

如何快速构建MxMxN张量?
EN

Stack Overflow用户
提问于 2018-08-09 14:21:21
回答 1查看 83关注 0票数 0

考虑具有dim(f)=Mdim(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行。

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-08-09 21:25:15

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

代码语言:javascript
复制
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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51760090

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档