MATLAB中文论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 503|回复: 12|关注: 0

[已答复] 如何去for循环,提高计算效率

[复制链接]

新手

13 麦片

财富积分


050


148

主题

414

帖子

0

最佳答案
发表于 2017-1-8 11:31:43 | 显示全部楼层 |阅读模式
本帖最后由 zhizi123410 于 2017-1-8 16:25 编辑

我有一段代码,感觉for循环太慢了点了,不知道有没有好的优化方案啊,就是去for,用矢量来代替循环
对于下面的图片,我给出这样的算法:
     TA=A2\eye(N);
    S1=-(TA*C2);  
    SL((L-2)*N+1:(L-1)*N,1:N)=S1;   %求S_(n-1),把它放入SL
   for j=n-1:-1:2
       if mod(j,2)==0   %j为偶数,用A1B1C1
        TA=(A1+(B1*S1))\eye(N);
        S1=-(TA*C1);
        SL((j-1)*N+1:j*N,1:N)=S1;      
       else  %j为奇数,用A2B2C2
        TA=(A2+(B2*S1))\eye(N);
        S1=-(TA*C2);
        SL((j-1)*N+1:(j)*N,1:N)=S1;                 
       end
    end

在论坛上也浏览了一些帖子,还没找到跟我的这个语句相匹配的,请大侠不辞吝教啊!!
谢谢啦!!
11.png

新建 Microsoft Word 97 - 2003 文档.pdf

97.88 KB, 下载次数: 6

MATLAB 基础讨论
版块优秀回答者

中级

1287 麦片

财富积分


5001500


0

主题

1690

帖子

289

最佳答案
  • 关注者: 41
发表于 2017-1-8 11:34:40 | 显示全部楼层
你最好把你的代码过程的背后原理讲一下,或者说这段代码你简单介绍一下,别人去研读的话也会花时间的

新手

13 麦片

财富积分


050


148

主题

414

帖子

0

最佳答案
 楼主| 发表于 2017-1-8 16:26:05 | 显示全部楼层
diting14 发表于 2017-1-8 11:34
你最好把你的代码过程的背后原理讲一下,或者说这段代码你简单介绍一下,别人去研读的话也会花时间的 ...

感谢您的支持,我把想做的东西写个文件,帮忙看下,如何?谢谢啊

MATLAB 基础讨论
版块优秀回答者

4

主题

324

帖子

30

最佳答案
  • 关注者: 6
发表于 2017-1-8 18:43:35 | 显示全部楼层
你这个问题和你写的对角矩阵什么的,基本上没得撒关联。。。。(读题理解有点浪费时间!)

你的问题是想不用循环迭代S,而是直接用操作矩阵的方法来代替。这种通用的取代方法好像不太成熟(或者是孤陋寡闻了)
你可以把ABC的数据发出来看下,找它迭代几次,是否有规律。
QQ浏览器截屏未命名.png

新手

13 麦片

财富积分


050


148

主题

414

帖子

0

最佳答案
 楼主| 发表于 2017-1-8 19:41:22 | 显示全部楼层
caicaibi 发表于 2017-1-8 18:43
你这个问题和你写的对角矩阵什么的,基本上没得撒关联。。。。(读题理解有点浪费时间!)

你的问题是想不 ...

首先谢谢你!ABC就是(N,N)矩阵啊,你的理解很正确,就是能用矢量方法代替循环最好了,他迭代的次数就是A的个数n-1啊,比如有10个A矩阵,那么迭代的次数是9次,但是遇到奇数跟偶数时,A2和A1是不同的啊。我想能不能把ABC放到一个矩阵里,用到哪个矩阵直接提取,而不是用循环。比如下面的例子:
function y=test
y=zeros(3,3,10);

for i=1:10
    for m=1:3
        for n=1:3
            y(m,n,i)=m*n*i;
        end
    end
end

这个例子,有个专家就给的很巧妙:
lin=(1:3)';
col=1:3;
pag=permute(1:10,[1,3,2]);
LN=ones(1,3);CN=ones(1,3);PN=ones(1,10);
y=lin(:,CN,PN).*col(LN,:,PN).*pag(LN,CN,:);

新手

13 麦片

财富积分


050


148

主题

414

帖子

0

最佳答案
 楼主| 发表于 2017-1-8 22:24:54 | 显示全部楼层
好像根本就没法实现吧、:'(

禁止发言

5 麦片

财富积分



0

主题

7

帖子

0

最佳答案
发表于 2017-1-9 09:45:11 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽

新手

13 麦片

财富积分


050


148

主题

414

帖子

0

最佳答案
 楼主| 发表于 2017-1-9 10:24:55 | 显示全部楼层
凌风_oFn9q 发表于 2017-1-9 09:45
**** 作者被禁止或删除 内容自动屏蔽 ****

期待回复啊

MATLAB 图像处理与计算机视觉
版块优秀回答者

1万

主题

1万

帖子

68

最佳答案
  • 关注者: 95
发表于 2017-1-11 18:09:57 | 显示全部楼层
>> syms A1 A2 B1 B2 C1 C2
n=5;
D1=diag(repmat([A1 A2],1,n));
D2=diag(repmat([B1 B2],1,n),1);
D2=D2(1:end-1,1:end-1);
D3=diag(repmat([C1 C2],1,n),-1);
D3=D3(2:end,2:end);
D=D1+D2+D3

D =

[ A1, B1,  0,  0,  0,  0,  0,  0,  0,  0]
[ C2, A2, B2,  0,  0,  0,  0,  0,  0,  0]
[  0, C1, A1, B1,  0,  0,  0,  0,  0,  0]
[  0,  0, C2, A2, B2,  0,  0,  0,  0,  0]
[  0,  0,  0, C1, A1, B1,  0,  0,  0,  0]
[  0,  0,  0,  0, C2, A2, B2,  0,  0,  0]
[  0,  0,  0,  0,  0, C1, A1, B1,  0,  0]
[  0,  0,  0,  0,  0,  0, C2, A2, B2,  0]
[  0,  0,  0,  0,  0,  0,  0, C1, A1, B1]
[  0,  0,  0,  0,  0,  0,  0,  0, C2, A2]

新手

13 麦片

财富积分


050


148

主题

414

帖子

0

最佳答案
 楼主| 发表于 2017-1-11 21:10:05 | 显示全部楼层
heawjc 发表于 2017-1-11 18:09
>> syms A1 A2 B1 B2 C1 C2
n=5;
D1=diag(repmat([A1 A2],1,n));

您好,谢谢回复,关键是求S 啊:D
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐上一条 /3 下一条

联系我们|版权保护|小黑屋|Archiver|手机版|MATLAB中文论坛 ( 苏ICP备08100737号

GMT+8, 2017-3-29 11:15 , Processed in 0.248014 second(s), 93 queries , XCache On.

Powered by Discuz! X3.3

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表