24小时热门版块排行榜    

查看: 1956  |  回复: 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的回帖
相关版块跳转 我要订阅楼主 田山东 的主题更新
信息提示
请填处理意见