zoukankan      html  css  js  c++  java
  • MATLAB 三阶张量T-QR分解

     这里所谓的张量和黎曼那里的张量是不一样的,那个张量更多的用在物理上,这个张量就是矩阵的扩展。比如零阶张量就是数,一阶张量就是向量,二阶张量就是矩阵,三阶四阶就是更高维的数的集合。这个领域现在在数学上还都是很新的东西,矩阵的秩我们都知道怎么求,但是三维的张量或更高维的张量的秩现在在数学上也没有结果。至于张量的奇异值分解也只是也只是用很早的如用HOSVD来处理,我感觉这并不完全合适,新的分解算法就连老美也都没研究出来,从二维到多维的确有很多基础的理论都不适用了,像两个张量相乘这样基础的算法,现在虽然有,但我感觉也不是通用的,还要继续改进。

      下面就是我看的一篇论文的张量相乘和分解方法,她的理论也可能不正确,不过这种新领域,大家都是在探索。

      论文在这里:http://www.cs.tufts.edu/tech_reports/reports/2010-5/report.pdf,他主要介绍的是T-svd,T-svd分解后合成的只是原张量的一个近似结果,而T-QR就能得到一个准确的结果,所以我这里用了T-QR。以Matlab角度来看T-SVD和T-QR的代码其实是很类似的。

    main.m

     1 clear all;
     2 close all;
     3 clc;
     4 n1=3;
     5 n2=3;
     6 n3=3;
     7 
     8 A(:,:,1)=[10 23 34;43 55 63;72 85 96];
     9 A(:,:,2)=[24 17 35;52 36 55;81 94 75];
    10 A(:,:,3)=[65 16 52;21 47 78;92 33 43];
    11 %A=imread('s.jpg');
    12 
    13 D=fft(A,[],3);
    14 
    15 for i=1:n3
    16     [q r]=qr(D(:,:,i));
    17     %[u s v]=svd(D(:,:,i));
    18     Q(:,:,i)=q;
    19     R(:,:,i)=r;
    20     %S(:,:,i)=s;
    21 end
    22 Q=ifft(Q,[],3);
    23 R=ifft(R,[],3);
    24 %S=ifft(S,[],3);
    25 
    26 
    27 B(:,:,1)=eye(n1,n2);
    28 B(:,:,2)=zeros(n1,n2);
    29 B(:,:,3)=zeros(n1,n2);
    30 
    31 
    32 %c=mul(mul(U,S),transpos(V));
    33 c=mul(Q,R);

    mul.m  张量相乘,论文第七页3.3的那个公式

     1 function c=mul(a,b)
     2 
     3     [a_n1 a_n2 a_n3]=size(a);
     4     [b_n1 b_n2 b_n3]=size(b);
     5     c=zeros(a_n1,b_n2,a_n3);
     6     A=cell(a_n3,1);
     7     B=cell(b_n3,1);
     8     
     9     for i=1:a_n3
    10         A{i}=a(:,:,i);
    11         B{i}=b(:,:,i);
    12     end
    13 
    14     index_up=zeros(1,a_n3);
    15     index_down=zeros(1,a_n3);
    16     for i=1:a_n3    
    17         index_up(i)=a_n3-i+1;
    18         index_down(i)=i;
    19     end
    20     
    21     s=cell(a_n3,a_n3);
    22     for i=1:a_n3
    23         for j=1:a_n3
    24             if i==j
    25                 s{i,j}=A{1};
    26             end       
    27             if j>i
    28                 s{i,j}=A{index_up(j-i)};
    29             end       
    30             if j<i
    31                 s{i,j}=A{index_down(i-j+1)};
    32             end      
    33         end   
    34     end
    35     
    36     re=cell(a_n3,1);
    37     for i=1:a_n3
    38         re{i}=zeros(a_n1,b_n2);
    39     end
    40 
    41     for i=1:a_n3
    42         for j=1:a_n3
    43             for k=1:1
    44                 re{i,k}=re{i,k}+s{i,j}*B{j,k};
    45             end
    46         end    
    47     end
    48 
    49     for i=1:a_n3
    50         c(:,:,i)=re{i};        
    51     end
    52     
    53 end

    transpos.m  张量求转置,论文第十页example3.15的公式

    1 function a=transpos(b)    
    2     [n1 n2 n3]=size(b);
    3     a=zeros(n2,n1,n3);
    4     for i=1:n3
    5         a(:,:,i)=b(:,:,i)';
    6     end
    7 end
  • 相关阅读:
    前端TypeScript编写的代码发布后怎么在浏览器中调试
    oracle中的执行计划
    oracle中的物化视图
    oracle中的exists 和not exists 用法
    Oracle中的索引详解
    Oracle中动态SQL拼接
    oracle 中sql优化的几种方法
    oracle中常用函数大全
    Oracle中游标的用法
    oracle中表分区的实现
  • 原文地址:https://www.cnblogs.com/ybqjymy/p/13646034.html
Copyright © 2011-2022 走看看