亲们:我编了一个有关非负矩阵分解算法的MATLAB程序,但是与别人的实验结果相比,迭代次数和时间比原始数据差很多,但是我不会优化程序,麻烦大神们给指导指导,非常感谢

function [W,iter_W,gradW]=QRPBB(V,Winit,H,maxiter,tol)

W=Winit;

alpha_max=1.0e+20;

alpha_min=1.0e-20;

M=5;

row=0.25;

gama=1.0e-4;

HHt=H*H';

VHt=V*H';

L=norm(HHt);

delta0=-sum(sum(H.*(W'*V)));

dQd0=sum(sum((H.*(W'*W*H))));

f0=delta0+0.5*dQd0;

for k=1:maxiter;

gradW=W*HHt-VHt;%计算W的梯度;

projgrad = norm(gradW(gradW<0 | W>0),'fro');%W的投影范数;

if projgrad

break;

end

if k==1;

alpha=1;%初始alpha

end

Z=max(0,W-gradW/L);%由构造的严格凸二次函数求出的封闭解;

gradZ=Z*HHt-VHt;

Zn=max(0,Z-alpha*gradZ);%为定义方向而定义的一个中间变量;

D=Zn-Z;%迭代方向;

delta=sum(sum(D.*gradZ));

dQd=sum(sum((H.*(Z'*Z*H))));

%搜步长

if k==1;

func(k)=f0 ;

else

func(k)=fn;

end

jj=min(k-1,M-1);

fmax=max(func(k-jj:k));

m=0;maxm=20;mk=0;

while (m

fn=func(k)+row^m*delta+0.5*row^(2*m)*dQd;

if(fn<=fmax+gama*row^m*delta),%判断目标函数下降;

mk=m;%满足使的目标函数下降的最小正整数;

break;

end

m=m+1;

end

lamda=row^mk;%更新lamda用于产生新的迭代点W;

%迭代格式

W=Z+lamda*D;

%BB步更新方向D;

s=D;

y=D*HHt;

b=sum(sum(s.*s));

c=sum(sum(s.*y));

alphaBB=b/c;

if (c<=0),

alpha=alpha_max;

else

alpha=min(alpha_max,max(alpha_min,alphaBB));

end

iter_W=k;

end

if k==maxiter,

fprintf('Max k in QRPBB\n');

end

测试问题

clear

clc

l= 100;

n = 200;

r =15;

% V = rand(;l,n);

Winit= rand(l,r);

Hinit= rand(r,n);

V = abs(rand(l,r))*abs(rand(r,n));

tol=1.e-7;

maxtime=1000;

maxiter=5000;%最大迭代次数

tic

[W,iter_W,gradW]=QRPBB(V,Winit,H,maxiter,tol);

toc

希望可以教教我具体怎样优化一个程序,才能使得它的迭代次数和时间降低,谢谢!!

matlab判断矩阵是否非负,有关非负矩阵的MATLAB程序优化相关推荐

  1. matlab 判断矩阵是正定、半正定还是负定

    用Matlab 判断矩阵是正定.半正定还是负定 % 判断矩阵m是正定.半正定还是负定 m = [2 -1; -1 2]; if issymmetric(m) % 检查矩阵是否对称% disp('矩阵对 ...

  2. matlab 判断矩阵奇异,Matlab 奇异值、奇异矩阵、svd函数

    奇异值: 奇异值分解法是线性代数中一种重要的矩阵分解法,在信号处理.统计学等领域有重要应用. 定义:设A为m*n阶矩阵,A'表示A的转置矩阵,A'*A的n个特征值的非负平方根叫作A的奇异值.记为σi( ...

  3. 基于模糊互补判断矩阵的多属性决策方法及matlab应用

    决策者利用一定的标度对属性进行两两比较,并构造判断矩阵,然后按一定的排序方法计算判断矩阵的排序向量,从而获得属性权重,最后在根据各种算子进行多属性群决策. (一)模糊互补判断矩阵排序法 1.加型模糊互 ...

  4. matlab判断矩阵不可约,用Matlab计算二元域GF(2)上的不可约多项式

    1 二元域 GF(2) 上的不可约多项式 二元域 GF(2)={0,1} 上的运算规则如下: 加法:+ 0 1 0 0 1 1 1 0 乘法:⋅ 0 1 0 0 0 1 0 1 二元域 GF(2) 上 ...

  5. MATLAB判断矩阵相等

    1. A==B;%得到的是一个矩阵,对应值相等则返回1,否则返回0 2. ~norm(A-B);%若A==B则A-B全零,norm(A-B)的结果为0,否则为1:其中norm为范数 3. ~sum(s ...

  6. 矩阵正定 matlab,判断矩阵是否为对称正定矩阵

    方法 1:尝试 Cholesky 分解 检查矩阵是否为对称正定矩阵的最有效方法是简单地尝试对矩阵使用 chol.如果分解失败,则矩阵不是对称正定矩阵.此方法不要求矩阵为对称矩阵也能成功进行测试(如果矩 ...

  7. matlab如何判断矩阵中元素都大于0_在MATLAB中找到矩阵中零元素的数量

    I have a NxM matrix for example named A. After some processes I want to count the zero elements. How ...

  8. matlab视频教程矩阵,Matlab-初级教程-系列1:matlab之入门教学视频-3 数组和矩阵分析2...

    Matlab-初级教程-系列1:matlab之入门教学视频-3 数组和矩阵分析2 一.矩阵的基本数值运算 矩阵的加减运算 a+b,a-b: a,b 的维数必须相同,对应的元素相加减, 2.矩阵的乘法 ...

  9. 怎么用matlab算矩阵行列式的值,新手如何利用matlab软件进行简单的矩阵运算 值得一看...

    有时候我们需要进行数据分析,但是对于复杂的矩阵运算的时候,我们往往会计算很长时间,这不仅仅是浪费我们的时间,而且计算量也特别的大.为了解决这个问题,我们利用数学软件matlab来进行简单的操作,复杂的 ...

最新文章

  1. es安装的时候遇到的所有的坑
  2. Elasticsearch 5.3.x 使用 Head 插件
  3. (Spring)依赖注入
  4. Android Studio的下载和安装教程(从ADT到AS)
  5. 2008年5月系统分析师考试上午试卷参考答案与考点解析2
  6. Spring-Cloud 学习笔记-(4)负载均衡器Ribbon
  7. OAuth 2.1 的进化之路
  8. java正则表达式中的坑String.matches(regex)、Pattern.matches(regex, str)和Matcher.matches()
  9. 什么情况使用 weak 关键字,相比 assign 有什么不同?
  10. 关于SQL Server 2005服务无法启动,报3417错误。(附带重装SQL时解决COM+目录问题)(转帖)
  11. Pycharm如何取消自动换行
  12. 数据结构排序系列详解之一 插入排序
  13. Collectors.averagingInt
  14. 设置eclipse主题风格
  15. linux模拟发包工具,发包开源工具TRex在IPS测试中的应用
  16. JAVA编写一个加密及解密程序
  17. 拉普拉斯(Laplace)变换——自控笔记系列(一)
  18. 关于zuul和nginx文件上传大小限制问题
  19. 日子大不了就是有粥喝粥,有菜吃菜
  20. 跳汰机的实操经验总结

热门文章

  1. 你在读博士期间明白的最深刻的道理是什么?
  2. [茗洋芳竹]程序员常用不常见很难得的地址大全,博主很辛苦
  3. ESTJ型人格的性格缺陷和心理问题分析
  4. 解读Sandbox:它不是一个游戏
  5. STM32G070RBT6基于Arduino框架GPIO外部中断
  6. [导入]《没卵头家》[DVD转RMVB中字][ 台湾经典剧情片]
  7. Android实战技巧之十六:getprop与dumpsys命令
  8. 7-6 统计英文字母和数字字符 (15 分)
  9. Python连接数据库 教程
  10. tokuDB 使用详解及其注意事项(2)