24小时热门版块排行榜    

查看: 2242  |  回复: 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 +3 布布和一二 2026-08-07 6/300 2026-08-07 17:51 by 医学老男孩
[基金申请] 固定端突然变了,今天 +6 archvillain 2026-08-06 10/500 2026-08-07 16:03 by 医学老男孩
[基金申请] 听说今天filecode变了 +24 布布和一二 2026-08-06 47/2350 2026-08-07 16:02 by zhiyanjiang
[基金申请] filecode与中标关系的预测 +3 布布和一二 2026-08-07 3/150 2026-08-07 15:09 by gltch
[论文投稿] 十年后又回来了,论文投稿求助 +4 哈哈114477 2026-08-01 4/200 2026-08-07 14:39 by jgy194592
[基金申请] 大家散了吧,后缀研究没有意义,别浪费时间了,过好目前的每一天,不要焦虑 +5 Tide man 2026-08-06 7/350 2026-08-07 13:11 by 医学老男孩
[基金申请] 关于豆爷回答的JTJC与%2F数量 +4 yang182083 2026-08-06 6/300 2026-08-07 12:43 by 虫友是什么虫
[基金申请] 面上再次挂了,太难了,躺也躺不了,倦也卷不过,小学校之殇! +23 低垂的野花 2026-07-31 31/1550 2026-08-07 12:22 by speculiar
[基金申请] filecode +14 等待解的谜 2026-08-06 19/950 2026-08-07 12:20 by wlwhappy
[基金申请] 基金中了 +11 laoda193707 2026-08-06 11/550 2026-08-07 10:54 by TT和NN
[基金申请] filecode +8 布布和一二 2026-08-06 11/550 2026-08-06 20:41 by tangpu318
[基金申请] 求各位大神看下 100+6 hpkpkpkp 2026-08-05 33/1650 2026-08-06 14:49 by zhiyanjiang
[基金申请] 影响面上的因素 +8 布布和一二 2026-08-05 11/550 2026-08-06 10:41 by 宝贝虫子
[基金申请] 8月时间戳变的,举个手。玩一下,释放压力 +9 archvillain 2026-08-04 11/550 2026-08-05 20:06 by wlwhappy
[基金申请] 好消息?这个有何含义??? +8 Tide man 2026-08-05 10/500 2026-08-05 16:14 by xmuxiaoyu
[考博] 【2027博士申请】纳米药物递送方向 20+3 13586093586 2026-08-03 4/200 2026-08-05 09:59 by lfy8008
[基金申请] 有没有H口的?有收到消息的吗? +3 超级海虾 2026-08-04 3/150 2026-08-04 17:26 by 学教育滴
[基金申请] 纯娱乐,不喜欢勿喷 +7 Tide man 2026-08-04 10/500 2026-08-04 15:10 by loufangrui
[基金申请] 面上提前没消息,有中的吗 +14 archvillain 2026-08-02 18/900 2026-08-04 14:42 by archvillain
[基金申请] 娱乐 +4 Tide man 2026-08-03 4/200 2026-08-04 11:51 by wgch518
信息提示
请填处理意见