首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从张量的每个额叶中提取对角元

从张量的每个额叶中提取对角元
EN

Stack Overflow用户
提问于 2015-02-09 03:05:24
回答 3查看 547关注 0票数 4

我有一个p-by-p-n张量。我想为每个p到p片提取对角线元素。有没有人知道怎么做而不用循环呢?

谢谢。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-02-09 04:56:21

Beholdvectorizing MATLAB problems的强大和强大的bsxfun,可以非常有效地使用MATLAB's linear indexing -

代码语言:javascript
复制
diags = A(bsxfun(@plus,[1:p+1:p*p]',[0:n-1]*p*p))

使用4 x 4 x 3大小的输入数组运行示例-

代码语言:javascript
复制
A(:,:,1) =
    0.7094    0.6551    0.9597    0.7513
    0.7547    0.1626    0.3404    0.2551
    0.2760    0.1190    0.5853    0.5060
    0.6797    0.4984    0.2238    0.6991
A(:,:,2) =
    0.8909    0.1493    0.8143    0.1966
    0.9593    0.2575    0.2435    0.2511
    0.5472    0.8407    0.9293    0.6160
    0.1386    0.2543    0.3500    0.4733
A(:,:,3) =
    0.3517    0.9172    0.3804    0.5308
    0.8308    0.2858    0.5678    0.7792
    0.5853    0.7572    0.0759    0.9340
    0.5497    0.7537    0.0540    0.1299
diags =
    0.7094    0.8909    0.3517
    0.1626    0.2575    0.2858
    0.5853    0.9293    0.0759
    0.6991    0.4733    0.1299

标杆

以下是几个运行时测试,将这种基于bsxfun的方法与 based approach进行大数据化的比较-

代码语言:javascript
复制
***** Datasize: 500 x 500 x 500 *****
----------------------- With BSXFUN
Elapsed time is 0.008383 seconds.
----------------------- With REPMAT + EYE
Elapsed time is 0.163341 seconds.

***** Datasize: 800 x 800 x 500 *****
----------------------- With BSXFUN
Elapsed time is 0.012977 seconds.
----------------------- With REPMAT + EYE
Elapsed time is 0.402111 seconds.

***** Datasize: 1000 x 1000 x 500 *****
----------------------- With BSXFUN
Elapsed time is 0.017058 seconds.
----------------------- With REPMAT + EYE
Elapsed time is 0.690199 seconds.
票数 9
EN

Stack Overflow用户

发布于 2015-02-09 03:56:09

我的一个建议是创建一个p x p逻辑恒等式矩阵,在第三维空间中复制这个n时间,然后使用这个矩阵来访问张量。就像这样,假设你的张量存储在A

代码语言:javascript
复制
ind = repmat(logical(eye(p)), [1 1 n]);
out = A(ind);

示例使用:

代码语言:javascript
复制
>> p = 5; n = 3;
>> A = reshape(1:75, p, p, n)

A(:,:,1) =

     1     6    11    16    21
     2     7    12    17    22
     3     8    13    18    23
     4     9    14    19    24
     5    10    15    20    25


A(:,:,2) =

    26    31    36    41    46
    27    32    37    42    47
    28    33    38    43    48
    29    34    39    44    49
    30    35    40    45    50


A(:,:,3) =

    51    56    61    66    71
    52    57    62    67    72
    53    58    63    68    73
    54    59    64    69    74
    55    60    65    70    75

>> ind = repmat(logical(eye(p)), [1 1 n]);
>> out = A(ind)

out =

     1
     7
    13
    19
    25
    26
    32
    38
    44
    50
    51
    57
    63
    69
    75

您会注意到,我们抓取第一片的对角线,然后是第二片的对角线,等等,直到最后一片。这些值都连接到一个向量中。

票数 6
EN

Stack Overflow用户

发布于 2016-03-17 13:12:23

只要阅读Divakar's的答案,并试图理解他为什么又比my idea快10倍,我就把两者混合在一起,最后得到了更快的代码:

代码语言:javascript
复制
A=reshape(A,[],n);
diags2 = A(1:p+1:p*p,:);

对于500x500x500张量,Divakar的解得到0.008s,使用Matlab2013a得到0.005s。可能普通索引是击败bsxfun的唯一方法。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28402197

复制
相关文章

相似问题

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