[已答复] 如何向量化或加速这个for循环 (求删)

[复制链接]
cxz9503 发表于 2021-4-7 10:23:19
本帖最后由 cxz9503 于 2021-4-8 09:54 编辑

怎么向量化或加速这个for循环
for i = 1: size(x,2)  D = diag(y(:,i))
  Y  = kron(x(:,1), sqrt(D));
  Z = kron(x(:,i),y(:,i));
  H = H +Y*Y' - temp*temp' ;
end

要调用n=size(x,2)次 kron,所以当维度比较大的时候非常慢。有什么办法向量化或者加速吗?
谢谢!



6 条回复


gywxd 发表于 2021-4-7 13:20:07
i=[1:size(x,2)]
H(i)=kron(x(:,i) , y(:,i))end kron(x(:,i) , y(:,i));

然后对 H(i)  求和试试

cxz9503 发表于 2021-4-7 13:52:10
gywxd 发表于 2021-4-7 13:20
i=[1:size(x,2)]
H(i)=kron(x(:,i) , y(:,i))end kron(x(:,i) , y(:,i));

i=[1:size(x,2)] 和 i = 1:size(x,2)感觉没区别啊?
第二行 end没理解 放哪啊?是不是打错了?

TouAkira 发表于 2021-4-7 14:21:00
看不明白你折腾啥,本质上相当于原始矩阵之一转置后与另一个相乘,再把各个元素重新排列
  1. N = 1000;
  2. x = randi( 31, N, N ) - 16; y = randi( 31, N, N ) - 16;
  3. H = zeros( N^2, 1 );
  4. Result = H;

  5. tic;
  6. for i = 1 : size( x, 2 )
  7.   H = H + kron( x( :, i ) , y( :, i ) );
  8. end
  9. toc;

  10. tic;
  11. temp = y * x.';
  12. Result = temp( : );
  13. toc;

  14. disp( max( abs( H - Result ) ) )
复制代码

你的原始循环:历时 10.421273 秒。
矩阵相乘:历时 0.197162 秒。
两次结果之间的最大差值:     0

cxz9503 发表于 2021-4-7 16:30:58
TouAkira 发表于 2021-4-7 14:21
看不明白你折腾啥,本质上相当于原始矩阵之一转置后与另一个相乘,再把各个元素重新排列

你的原始循环:历 ...

对于我的原问题,你说得对!
我现在的问题才是我的目标,之前的问题简化不当,抱歉。

TouAkira 发表于 2021-4-8 02:09:22
cxz9503 发表于 2021-4-7 04:30
对于我的原问题,你说得对!
我现在的问题才是我的目标,之前的问题简化不当,抱歉。 ...

你太能折腾了同学,到底要算什么,请理清思路,别一会儿就改一次公式好不好?

短时间内你连着换了三回不同的计算公式,一会儿是H = H + kron( x( :, i ) , y( :, i ) );一会儿是H = H + kron( x( :, i ) , y( :, i ) ) * kron( x( :, i ) , y( :, i ) ).' ;再来又捣鼓出个H = H +Y*Y' - temp*temp' ;

一开始以为你要吃苹果,别人刚把削皮的方法准备好,你又要改吃核桃不吃苹果了;等别人想好用夹子,你又打算换成吃石榴了?


到目前为止你连自己的目标都没搞清楚,写的代码逻辑混乱,Z = kron(x(:,i),y(:,i));结果又  H = H +Y*Y' - temp*temp' ;这个temp是个什么鬼,Z矩阵没用上,你还每步都算它干什么!

请先去仔细学习发帖提示和置顶帖子,尤其是《 你知道如何正确提问么? 》、《 为什么你的帖子没人回 》这些帖子,学会准确、清晰、无歧义地表述问题!


cxz9503 发表于 2021-4-8 09:48:15
TouAkira 发表于 2021-4-8 02:09
你太能折腾了同学,到底要算什么,请理清思路,别一会儿就改一次公式好不好?

短时间内你连着换了三回不 ...

我之前挂着vpn打开网页编辑问题很卡,删了一些东西都没发现。简化问题弄巧成拙,十分抱歉!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

相关帖子
热门教程
站长推荐
快速回复 返回顶部 返回列表