24小时热门版块排行榜    

查看: 2293  |  回复: 8

田山东

捐助贵宾 (著名写手)

[求助] matlab矢量写法,这样可以吗?急求啊!!

大家好,在论坛上和网上也学到了一些将for语句写成矢量的写法,但是我的这个里面有if句法,如何来实现呢?我试了下,没有成功
就这样几句话:
ny0=64;
fi=2*pi/16;
t=2.8;
I=1i;
H0=zeros(ny0,ny0);
for j=1:ny0;
        if(mod(jl,2)==1)
        m=(j(l)+1)/2;
        else
        m=j(l)/2;
    end
        Ax=-(m-1)*0.5*fi;  
          if (mod(j,4)==1)
          H0(j,j+1)=t*exp(I*Ax);  
      end
end
我试着这样去做:


ny0=64;
fi=2*pi/16;
t=2.8;
I=1i;
H0=zeros(ny0,ny0);
j=1:ny0;
l=1:1:length(j);
        if(mod(j(l),2)==1)
        m=(j(l)+1)/2;
        else
        m=j(l)/2;
    end
        Ax=-(m-1)*0.5*fi;  
          if (mod(j(l),4)==1)
          H0(j(l),j(l)+1)=t*exp(I*Ax);  
      end
但是很奇怪啊,里面没数据啊。
有没有人可以帮我下啊?
回复此楼
everythinghasitsseason.enjoyyourlife.
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

田山东

捐助贵宾 (著名写手)

给定j,得到m,得到Ax,然后对H0赋值
everythinghasitsseason.enjoyyourlife.
2楼2012-12-05 20:18:18
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

田山东

捐助贵宾 (著名写手)

看了网上的讨论,新版本中向量化跟for循环差距已经不是很大,看来我是多虑了。
同意的顶下,也是对我摸索这么久的一个奖励
看帖不顶是小狗
回帖是一种美德
不一定要答案。

要人气。。
everythinghasitsseason.enjoyyourlife.
3楼2012-12-05 20:28:42
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

田山东

捐助贵宾 (著名写手)

可以花钱买BB 吗?花点钱买点,给大家送点,攒点人气啊。。
everythinghasitsseason.enjoyyourlife.
4楼2012-12-05 20:29:27
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

田山东

捐助贵宾 (著名写手)

谁能帮忙解决了,还是用下矢量化方法吧。还是希望比较一下速度。
everythinghasitsseason.enjoyyourlife.
5楼2012-12-05 21:09:37
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

libralibra

至尊木虫 (著名写手)

骠骑将军

【答案】应助回帖

感谢参与,应助指数 +1
xzhdty: 谢谢骠骑将军 2012-12-05 21:59:11
你能仔细检查一下的你的代码吗?
第一个if(mod(j(l),2)==1)少了j后面的括号,但是l又是什么?前面没有定义啊
matlab/VB/python/c++/Java写程序请发QQ邮件:790404545@qq.com
6楼2012-12-05 21:33:22
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

田山东

捐助贵宾 (著名写手)

引用回帖:
6楼: Originally posted by libralibra at 2012-12-05 21:33:22
你能仔细检查一下的你的代码吗?
第一个if(mod(j(l),2)==1)少了j后面的括号,但是l又是什么?前面没有定义啊

谢谢你了。你说的是上面那几行语句,你看下下面那几行,l=1:1:length(j)表示j的长度
everythinghasitsseason.enjoyyourlife.
7楼2012-12-06 09:03:01
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

baobiao007

木虫 (职业作家)

中国特色

来捧个场咯
我同意叔本华的观点,人们投身艺术和科学领域的强烈愿望之一就是逃离痛苦、残酷和枯燥无味的现实生活,逃离自己飘忽不定的七情六欲的桎梏。--爱因斯坦
8楼2012-12-06 17:02:18
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

libralibra

至尊木虫 (著名写手)

骠骑将军

【答案】应助回帖

引用回帖:
7楼: Originally posted by 田山东 at 2012-12-06 09:03:01
谢谢你了。你说的是上面那几行语句,你看下下面那几行,l=1:1:length(j)表示j的长度...

j=1:ny0;
循环标志l = 1:length(j),所以j(l)==l
你的代码就是
CODE:
ny0=64;
fi=2*pi/16;
t=2.8;
I=1i;
H0=zeros(ny0,ny0);
j=1:ny0;
for l=1:length(j)
    if(mod(l,2)==1)
        m=(l+1)/2;
    else
        m=l/2;
    end
    Ax=-(m-1)*0.5*fi;
    if (mod(l,4)==1)
        H0(l,l+1)=t*exp(I*Ax);
    end
end

然后分析一下:
j = 1:64;
开始循环j的元素l
如果是奇数,自加1除以2,如果是偶数,除以2,赋值给m
根据m得到Ax
如果当前元素除4余1,给H0的(l,l+1)元素赋值.
j中所有除以4余1的元素是
CODE:
1     5     9    13    17    21    25    29    33    37    41    45    49    53    57    61

一共16个,等于其实你只需要给H0的这16个元素赋值
CODE:
(1,2)     (5,6)     (9,10)    (13,14)    (17,18)    (21,22)    (25,26)    (29,30)    (33,34)    (37,38)    (41,42)    (45,46)    (49,50)    (53,54)    (57,58)    (61,62)

既然给H0赋值的元素个数只有16个,为什么要循环64次呢?等于有48次循环计算的m和Ax根本没有用处.
那么修改一下:revise 1
CODE:
for l=1:length(j)
    if (mod(l,4)==1)
        m=(l+1)/2;
        Ax=-(m-1)*0.5*fi;
        H0(l,l+1)=t*exp(I*Ax);
    end
end

既然mod(l,4)==1,就有l=4*n+1=2*2n+1,说明l除以2也余1,直接计算m然后给H0元素赋值.

revise2,matlab的for可以指定步长,连if判断都不需要了
CODE:
for l=1:4:length(j)
    m=(l+1)/2;
    Ax=-(m-1)*0.5*fi;
    H0(l,l+1)=t*exp(I*Ax);
end

向量化的办法:
revise3,既然是给全0矩阵H0的16个元素赋值,那你直接运用向量化计算出来结果,然后赋值就行了.不过可能有些绕,需要用好几个函数来实现
可以通过sparse来实现,不过sparse之后用full只能还原到61*62维,因为其他元素都是0
所以需要用局部矩阵赋值的办法
CODE:
ny0=64;
fi=2*pi/16;
t=2.8;
I=1i;
H0=zeros(ny0,ny0);
j=1:ny0;
l = j(mod(j,4)==1); % 行下标,16个
n = l+1; % 列下标,16个
m = (l+1)/2; % m,16个
Ax = -(m-1)*0.5*fi; % Ax,16个
expAx = t*exp(I*Ax); % H0的被赋值元素,16个
h = sparse(l,n,expAx); % 根据下标和元素生成稀疏矩阵
H0(1:max(l),1:max(n)) = full(h); % 给H0对应位置赋值

revise 4,终极向量化办法,得到行列号后,直接得到下标序列,将H0看做一维向量赋值
CODE:
ny0=64;
fi=2*pi/16;
t=2.8;
I=1i;
H0=zeros(ny0,ny0);
j=1:ny0;
l = j(mod(j,4)==1); % 行下标,16个
n = l+1; % 列下标,16个
m = (l+1)/2; % m,16个
Ax = -(m-1)*0.5*fi; % Ax,16个
expAx = t*exp(I*Ax); % H0的被赋值元素,16个
H0(sub2ind([ny0,ny0],l,n)) = expAx; % 直接给H0对应位置赋值

matlab/VB/python/c++/Java写程序请发QQ邮件:790404545@qq.com
9楼2012-12-06 22:24:58
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
相关版块跳转 我要订阅楼主 田山东 的主题更新
最具人气热帖推荐 [查看全部] 作者 回/看 最后发表
[基金申请] 面上合作单位盖章 +6 ssyjh 2026-08-27 9/450 2026-09-01 20:01 by huagongfeihu
[基金申请] 为什么资助数各大高校都创新高,自己申请怎么就这么难 +13 Kittylucky 2026-08-27 14/700 2026-09-01 11:06 by feng6531
[论文投稿] 小白求助 投论文要求的highlights应该如何写 5+3 l1963982152 2026-08-29 4/200 2026-09-01 09:04 by 北京莱茵编辑
[基金申请] 麻烦专家们看看评委们的意见(F口面上) +7 gdd2018 2026-08-28 12/600 2026-09-01 08:32 by 尼古拉斯小虫
[基金申请] 国社科又开始会评了,不知道这次命运如何 +7 雨打竹帘 2026-08-30 11/550 2026-08-31 23:16 by hittle2008
[基金申请] 基金未中,这种答复是模板吗? +6 zhaosm1982 2026-08-27 7/350 2026-08-31 21:18 by qdxxmc
[基金申请] 哪位高人中了,把查询到的截图贴出来让我看看,让我长长见识 +6 yuleib84 2026-08-26 7/350 2026-08-31 19:46 by 鱼翔浅底1
[基金申请] 面上意见出来了 +12 黄鸟于飞Chao 2026-08-29 23/1150 2026-08-31 18:57 by 黄鸟于飞Chao
[基金申请] 能否申诉? +7 echo8914667 2026-08-30 8/400 2026-08-31 17:00 by yihongxu
[基金申请] 中青基了要发朋友圈吗? +7 349506619 2026-08-28 7/350 2026-08-31 13:39 by 冼亮淀粉酶
[基金申请] 2026年叶企孙基金 +4 bud_bud 2026-08-27 7/350 2026-08-29 07:23 by foolishmani
[基金申请] 系统查不到 +11 董八千 2026-08-26 11/550 2026-08-28 18:06 by Leogzhya
[基金申请] 基金系统什么内容也没有 30+4 winsaint 2026-08-27 9/450 2026-08-28 11:06 by maolC
[基金申请] 怎么查啊 +6 huang1991js 2026-08-26 6/300 2026-08-28 08:42 by winsaint
[基金申请] 看板上这么多中的,有点像50人群里49个人都是骗子的那种感觉…… +5 a089 2026-08-26 6/300 2026-08-27 14:05 by jonewore
[基金申请] 为什么 国际(地区)合作与交流项目 没有放榜? 10+3 majunge000 2026-08-26 11/550 2026-08-27 08:42 by 北京莱茵编辑
[基金申请] 我不理解! +15 Edward_pc 2026-08-26 23/1150 2026-08-26 20:34 by zzuzxg
[基金申请] 系统进不去 +4 yanglien 2026-08-26 5/250 2026-08-26 11:10 by wenfengw83
[基金申请] 项目信息和经费信息在系统里都可以看到了 +6 wittyboy 2026-08-26 14/700 2026-08-26 10:55 by wittyboy
[基金申请] 牛来!米来!面来! +8 beefly 2026-08-26 8/400 2026-08-26 08:37 by xuzhipiao
信息提示
请填处理意见