24小时热门版块排行榜    

查看: 2248  |  回复: 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的回帖
相关版块跳转 我要订阅楼主 田山东 的主题更新
最具人气热帖推荐 [查看全部] 作者 回/看 最后发表
[基金申请] 好奇怪的filecode +5 布布和一二 2026-08-08 6/300 2026-08-12 16:11 by 云上清扬
[基金申请] FileCode能看出啥? +8 要乐观耀哥 2026-08-10 21/1050 2026-08-12 16:08 by 云上清扬
[基金申请] 长年满屏的广告,版主太不责任了。基金也等的急 +4 gltch 2026-08-12 4/200 2026-08-12 16:08 by eulota
[论文投稿] 职称评审,求友友推荐见刊最快的期刊 +4 工厂打螺丝 2026-08-08 4/200 2026-08-12 09:18 by hansi2025
[基金申请] 奇怪,两个人的filecode固定段从头到尾一模一样 +7 布布和一二 2026-08-10 10/500 2026-08-12 09:12 by 布布和一二
[基金申请] 是这周出结果还是下周出结果? +3 yuleib84 2026-08-11 3/150 2026-08-11 21:53 by jnhyjjm
[基金申请] 小木虫上这么多卖论文的,真有人买论文么?感觉没必要啊 +8 Tide man 2026-08-10 9/450 2026-08-11 20:39 by beefly
[基金申请] 有时候,自然基金真的不能太认真 (我的申报经验) +3 majunge000 2026-08-11 4/200 2026-08-11 20:13 by lch2012
[基金申请] 为什么网上很多人说本周 12号出结果 +6 瞬息宇宙 2026-08-10 7/350 2026-08-11 19:25 by Tide man
[基金申请] 听说今天filecode变了 +26 布布和一二 2026-08-06 49/2450 2026-08-11 13:18 by WH3796
[基金申请] 关于代码变化问题,想知道的进来 +17 且听虎啸 2026-08-07 24/1200 2026-08-10 18:35 by zhangduo2008
[基金申请] 国自然结果 +4 Vierhys 2026-08-10 8/400 2026-08-10 15:06 by Vierhys
[基金申请] 据悉今年马上要出结果了 +7 瞬息宇宙 2026-08-10 8/400 2026-08-10 12:42 by Vivilian
[基金申请] filecode与中标关系的预测 +5 布布和一二 2026-08-07 5/250 2026-08-09 16:15 by 袁向阳007
[基金申请] fileCode有新解读? +10 Tide man 2026-08-08 18/900 2026-08-09 12:55 by 仁砚薪传
[基金申请] 关于filecode,很负责任的告诉大家 +6 爱看书的可乐 2026-08-08 7/350 2026-08-08 22:13 by a_niu
[基金申请] 关于豆爷回答的JTJC与%2F数量 +5 yang182083 2026-08-06 7/350 2026-08-08 18:29 by zhanghaozhu
[基金申请] 固定端突然变了,今天 +6 archvillain 2026-08-06 10/500 2026-08-07 16:03 by 医学老男孩
[基金申请] filecode变化情况 +6 布布和一二 2026-08-07 22/1100 2026-08-07 14:45 by 且听虎啸
[基金申请] filecode +14 等待解的谜 2026-08-06 19/950 2026-08-07 12:20 by wlwhappy
信息提示
请填处理意见