matlab练习程序(三阶张量T-QR分解)

简介: 转自:http://www.cnblogs.com/tiandsp/archive/2012/10/31/2747971.html  这里所谓的张量和黎曼那里的张量是不一样的,那个张量更多的用在物理上,这个张量就是矩阵的扩展。

转自:http://www.cnblogs.com/tiandsp/archive/2012/10/31/2747971.html 

这里所谓的张量和黎曼那里的张量是不一样的,那个张量更多的用在物理上,这个张量就是矩阵的扩展。比如零阶张量就是数,一阶张量就是向量,二阶张量就是矩阵,三阶四阶就是更高维的数的集合。这个领域现在在数学上还都是很新的东西,矩阵的秩我们都知道怎么求,但是三维的张量或更高维的张量的秩现在在数学上也没有结果。至于张量的奇异值分解也只是也只是用很早的如用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的代码其实是很类似的。

首先是两个函数的代码,放在.m文件中,文件名就是默认文件名(函数名)

 1   mul.m

function c=mul(a,b)

    [a_n1 a_n2 a_n3]=size(a);
    [b_n1 b_n2 b_n3]=size(b);
    c=zeros(a_n1,b_n2,a_n3);
    A=cell(a_n3,1);
    B=cell(b_n3,1);
    
    for i=1:a_n3
        A{i}=a(:,:,i);
        B{i}=b(:,:,i);
    end

    index_up=zeros(1,a_n3);
    index_down=zeros(1,a_n3);
    for i=1:a_n3    
        index_up(i)=a_n3-i+1;
        index_down(i)=i;
    end
    
    s=cell(a_n3,a_n3);
    for i=1:a_n3
        for j=1:a_n3
            if i==j
                s{i,j}=A{1};
            end       
            if j>i
                s{i,j}=A{index_up(j-i)};
            end       
            if j<i
                s{i,j}=A{index_down(i-j+1)};
            end      
        end   
    end
    
    re=cell(a_n3,1);
    for i=1:a_n3
        re{i}=zeros(a_n1,b_n2);
    end

    for i=1:a_n3
        for j=1:a_n3
            for k=1:1
                re{i,k}=re{i,k}+s{i,j}*B{j,k};
            end
        end    
    end

    for i=1:a_n3
        c(:,:,i)=re{i};        
    end
    
end

2  transpos.m 

function a=transpos(b)    
    [n1 n2 n3]=size(b);
    a=zeros(n2,n1,n3);
    for i=1:n3
        a(:,:,i)=b(:,:,i)';
    end
end

最后是在matlab命令行中的代码:

clear all;
close all;
clc;
n1=3;
n2=3;
n3=3;

A(:,:,1)=[10 23 34;43 55 63;72 85 96];
A(:,:,2)=[24 17 35;52 36 55;81 94 75];
A(:,:,3)=[65 16 52;21 47 78;92 33 43];
%A=imread('s.jpg');

D=fft(A,[],3);

for i=1:n3
    [q r]=qr(D(:,:,i));
    %[u s v]=svd(D(:,:,i));
    Q(:,:,i)=q;
    R(:,:,i)=r;
    %S(:,:,i)=s;
end
Q=ifft(Q,[],3);
R=ifft(R,[],3);
%S=ifft(S,[],3);


B(:,:,1)=eye(n1,n2);
B(:,:,2)=zeros(n1,n2);
B(:,:,3)=zeros(n1,n2);


%c=mul(mul(U,S),transpos(V));
c=mul(Q,R);
c

 

目录
相关文章
|
1月前
|
监控 算法 数据安全/隐私保护
基于三帧差算法的运动目标检测系统FPGA实现,包含testbench和MATLAB辅助验证程序
本项目展示了基于FPGA与MATLAB实现的三帧差算法运动目标检测。使用Vivado 2019.2和MATLAB 2022a开发环境,通过对比连续三帧图像的像素值变化,有效识别运动区域。项目包括完整无水印的运行效果预览、详细中文注释的代码及操作步骤视频,适合学习和研究。
|
6月前
|
编解码 算法 异构计算
基于FPGA的NC图像质量评估verilog实现,包含testbench和MATLAB辅助验证程序
在Vivado 2019.2和Matlab 2022a中测试的图像质量评估算法展示了效果。该算法基于NC指标,衡量图像与原始图像的相似度,关注分辨率、色彩深度和失真。提供的Verilog代码段用于读取并比较两个BMP文件,计算NC值。
|
6月前
|
算法 调度
电网两阶段鲁棒优化调度模型(含matlab程序)
电网两阶段鲁棒优化调度模型(含matlab程序)
|
2月前
|
监控 算法 安全
基于颜色模型和边缘检测的火焰识别FPGA实现,包含testbench和matlab验证程序
本项目展示了基于FPGA的火焰识别算法,可在多种应用场景中实时检测火焰。通过颜色模型与边缘检测技术,结合HSV和YCbCr颜色空间,高效提取火焰特征。使用Vivado 2019.2和Matlab 2022a实现算法,并提供仿真结果与测试样本。FPGA平台充分发挥并行处理优势,实现低延迟高吞吐量的火焰检测。项目包含完整代码及操作视频说明。
|
5月前
|
存储 算法 计算机视觉
m基于FPGA的FIR低通滤波器实现和FPGA频谱分析,包含testbench和滤波器系数MATLAB计算程序
在Vivado 2019.2平台上开发的系统,展示了数字低通滤波器和频谱分析的FPGA实现。仿真结果显示滤波效果良好,与MATLAB仿真结果一致。设计基于FPGA的FIR滤波器,利用并行处理和流水线技术提高效率。频谱分析通过离散傅里叶变换实现。提供了Verilog核心程序以示例模块工作原理。
51 4
基于广义Benders分解法的综合能源系统优化规划(matlab程序)
基于广义Benders分解法的综合能源系统优化规划(matlab程序)
|
6月前
|
数据挖掘
考虑时空相关性的风电功率预测误差建模与分析(matlab程序)
考虑时空相关性的风电功率预测误差建模与分析(matlab程序)
|
6月前
|
算法 SoC
基于多目标粒子群算法的配电网储能选址定容(含MATLAB程序)
基于多目标粒子群算法的配电网储能选址定容(含MATLAB程序)
|
6月前
|
算法
考虑源荷不确定性的微网优化(含matlab程序)
考虑源荷不确定性的微网优化(含matlab程序)
|
6月前
|
数据安全/隐私保护
matlab程序,地震波压缩、地震波缩尺、地震波压缩时间,调整时长、时间间隔
地震波格式转换、时程转换、峰值调整、规范反应谱、计算反应谱、计算持时、生成人工波、时频域转换、数据滤波、基线校正、Arias截波、傅里叶变换、耐震时程曲线、脉冲波合成与提取、三联反应谱、地震动参数、延性反应谱、地震波缩尺、功率谱密度

热门文章

最新文章