如何把for循环改成电路方程的矩阵形式式,去掉外循环,如下

一个matlab的画图程序,怎么将for循环去掉,提高运行速度_百度知道
一个matlab的画图程序,怎么将for循环去掉,提高运行速度
01,y(j);color&#39:100
if y(j)&.01:0,怎么将for循环改成矩阵运算;color&#39.5)^2+(y(j)-0.866)^2)])
endend程序如上.732)
plot(x(i).5)^2+(y(j)-0;;,提高运行速度.732)
plot(x(i);y=0.99,2;;figure(1)hold onfor i=1:0.732-x(i)*1;;s&#39.99,或者其他方式;linewidth&#39:50
for j=1,&#39,2;x=0clc。matlab的循环计算速度实在太慢了,&#39,y(j),[sqrt(x(i)^2+y(j)^2) sqrt((x(i)-1)^2+y(j)^2) sqrt((x(i)-0:0,':100
for j=1.866)^2)])
endendfor i=51:0,'s&#39,[sqrt(x(i)^2+y(j)^2) sqrt((x(i)-1)^2+y(j)^2) sqrt((x(i)-0,&#39:100
if y(j)&linewidth'(1,'(x(i)*1
/zhidao/wh%3D600%2C800/sign=44e4d3aacc/a6efce1b9d16fdfa79fc.baidu.jpg" target="_blank" title="点击查看大图" class="ikqb_img_alink"><img class="ikqb_img" src="http.baidu<a href="http://g.com/zhidao/wh%3D450%2C600/sign=abbb65c70cf41bd5da06e0f064eaadfd/a6efce1b9d16fdfa79fc.jpg" esrc="http://g.com/zhidao/pic/item/a6efce1b9d16fdfa79fc://g.hiphotos.hiphotos
提问者采纳
可以定义一个的矩阵然后根据公式来填充对应的像素,用image之类的函数来画图就好了
提问者评价
其他类似问题
为您推荐:
运行速度的相关知识
其他1条回答
将画图和计算分开:先定义几个矩阵符号辅助画图及颜色计算然后直接用二维画图函数画图慢慢根据需要修正参数
程序中的计算不是影响速度的因素,而是循环本身,因为每个点的颜色不同,我的问题是怎么取消循环,有这样的画图函数吗(每个点都可以定义颜色)?
使用plot(x,y)绘图时:&#8226;若x和y均是矢量或均是矩阵,要求x和y的均有相同的 size;&#8226;若x和y中有一个是矢量,有一个是矩阵,要求:矢量的的列数与矩阵的列数相等;&#8226;调节画图颜色定义一个三维矩阵Z,循环计算的结果存入矩阵Z;画图表达式就简单了画图参数——S:方块 大小 2 三角矩阵可以替代画点
问题在颜色参数上,找个替代方法,我没时间尝试了,哈哈
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁矩阵里还嵌套矩阵的二重循环怎么优化成矩阵运算,图示为一个例子
前提是保证你得dmat支持参数为向量情况,也就是输入标量和矢量或矢量与矢量,并且返回一个矢量结果% 标量与矢量
d = dmat(1, pop(:,1)); % 返回d为列向量
% 矢量与矢量
d = dmat(pop(:,1), pop(:,2)); % 返回d为列向量
改矩阵运算并非没有缺点,缺点就是得多生成一个数据,计算使用内存加倍。现在电脑内存都够大,只要给Matlab足够内存应该就行n = size(pop, 1);
pop_m1 = [ones(n,1), pop(:, 1:end-1)];
d = dmat(pop_m1, pop);
totalDist = sum(d, 2);
凭经验写的,没有运行,有哪些不对的欢迎指正
从你给的例子中不能明确知道dmat和pop到底是矩阵还是函数,但是从你“矩阵里还嵌套矩阵”这句话中推断dmat和pop大概都是数组,以下所有程序都只针对dmat和pop都是数组的情况,如果不是这样你需要给出dmat函数或者pop函数的内容。因为你没有给定size,所以假定size设置如下以便测试:&br&&div class=&highlight&&&pre&&code class=&language-matlab&&&span class=&n&&n&/span& &span class=&p&&=&/span& &span class=&mf&&3e3&/span&&span class=&p&&;&/span&
&span class=&n&&popSize&/span& &span class=&p&&=&/span& &span class=&mf&&3e3&/span&&span class=&p&&;&/span&
&span class=&n&&mDmat&/span& &span class=&p&&=&/span& &span class=&mf&&3e3&/span&&span class=&p&&;&/span&
&span class=&n&&nDmat&/span& &span class=&p&&=&/span& &span class=&mf&&3e3&/span&&span class=&p&&;&/span&
&span class=&n&&dmat&/span& &span class=&p&&=&/span& &span class=&nb&&rand&/span&&span class=&p&&(&/span&&span class=&n&&mDmat&/span&&span class=&p&&,&/span&&span class=&n&&nDmat&/span&&span class=&p&&);&/span&
&span class=&n&&pop&/span& &span class=&p&&=&/span& &span class=&n&&randi&/span&&span class=&p&&(&/span&&span class=&n&&min&/span&&span class=&p&&(&/span&&span class=&n&&mDmat&/span&&span class=&p&&,&/span&&span class=&n&&nDmat&/span&&span class=&p&&),&/span&&span class=&n&&popSize&/span&&span class=&p&&,&/span&&span class=&n&&n&/span&&span class=&p&&);&/span&
&/code&&/pre&&/div&你原始的方法是:&br&&div class=&highlight&&&pre&&code class=&language-matlab&&&span class=&n&&totalDist&/span& &span class=&p&&=&/span& &span class=&nb&&zeros&/span&&span class=&p&&(&/span&&span class=&n&&popSize&/span&&span class=&p&&,&/span&&span class=&mi&&1&/span&&span class=&p&&);&/span&
&span class=&k&&for&/span& &span class=&n&&p&/span& &span class=&p&&=&/span& &span class=&mi&&1&/span&&span class=&p&&:&/span&&span class=&n&&popSize&/span&
&span class=&n&&d&/span& &span class=&p&&=&/span& &span class=&n&&dmat&/span&&span class=&p&&(&/span&&span class=&mi&&1&/span&&span class=&p&&,&/span&&span class=&n&&pop&/span&&span class=&p&&(&/span&&span class=&n&&p&/span&&span class=&p&&,&/span&&span class=&mi&&1&/span&&span class=&p&&));&/span&
&span class=&k&&for&/span& &span class=&n&&k&/span& &span class=&p&&=&/span& &span class=&mi&&2&/span&&span class=&p&&:&/span&&span class=&n&&n&/span&
&span class=&n&&d&/span& &span class=&p&&=&/span& &span class=&n&&d&/span& &span class=&o&&+&/span& &span class=&n&&dmat&/span&&span class=&p&&(&/span&&span class=&n&&pop&/span&&span class=&p&&(&/span&&span class=&n&&p&/span&&span class=&p&&,&/span&&span class=&n&&k&/span&&span class=&o&&-&/span&&span class=&mi&&1&/span&&span class=&p&&),&/span&&span class=&n&&pop&/span&&span class=&p&&(&/span&&span class=&n&&p&/span&&span class=&p&&,&/span&&span class=&n&&k&/span&&span class=&p&&));&/span&
&span class=&k&&end&/span&
&span class=&n&&totalDist&/span&&span class=&p&&(&/span&&span class=&n&&p&/span&&span class=&p&&)&/span& &span class=&p&&=&/span& &span class=&n&&d&/span&&span class=&p&&;&/span&
&span class=&k&&end&/span&
&span class=&c&&% Elapsed time is 1.136523 seconds.&/span&
&/code&&/pre&&/div&如果dmat和pop如假定一般都是数组,那么这种和索引有关的向量化一般会考虑转化为线性索引.&br&将二维索引转化为一维索引(即线性索引)可以用sub2ind也可以自己根据索引的顺序计算,但是sub2ind会有overhead,所以我们选择直接计算,例如M-by-N的矩阵A中,A(i,j)的线性索引是:&div class=&highlight&&&pre&&code class=&language-text&&i+(j-1)*M
&/code&&/pre&&/div&应用到问题中,内层循环可以向量化为:&br&&div class=&highlight&&&pre&&code class=&language-matlab&&&span class=&n&&totalDist&/span& &span class=&p&&=&/span& &span class=&nb&&zeros&/span&&span class=&p&&(&/span&&span class=&n&&popSize&/span&&span class=&p&&,&/span&&span class=&mi&&1&/span&&span class=&p&&);&/span&
&span class=&k&&for&/span& &span class=&n&&p&/span& &span class=&p&&=&/span& &span class=&mi&&1&/span&&span class=&p&&:&/span&&span class=&n&&popSize&/span&
&span class=&n&&totalDist&/span&&span class=&p&&(&/span&&span class=&n&&p&/span&&span class=&p&&)&/span& &span class=&p&&=&/span& &span class=&n&&dmat&/span&&span class=&p&&(&/span&&span class=&mi&&1&/span&&span class=&p&&,&/span&&span class=&n&&pop&/span&&span class=&p&&(&/span&&span class=&n&&p&/span&&span class=&p&&,&/span&&span class=&mi&&1&/span&&span class=&p&&))&/span&&span class=&o&&+&/span&&span class=&n&&sum&/span&&span class=&p&&(&/span&&span class=&n&&dmat&/span&&span class=&p&&(&/span&&span class=&n&&pop&/span&&span class=&p&&(&/span&&span class=&n&&p&/span&&span class=&p&&,&/span&&span class=&mi&&1&/span&&span class=&p&&:&/span&&span class=&n&&n&/span&&span class=&o&&-&/span&&span class=&mi&&1&/span&&span class=&p&&)&/span&&span class=&o&&+&/span&&span class=&p&&(&/span&&span class=&n&&pop&/span&&span class=&p&&(&/span&&span class=&n&&p&/span&&span class=&p&&,&/span&&span class=&mi&&2&/span&&span class=&p&&:&/span&&span class=&n&&n&/span&&span class=&p&&)&/span&&span class=&o&&-&/span&&span class=&mi&&1&/span&&span class=&p&&)&/span&&span class=&o&&*&/span&&span class=&n&&mDmat&/span&&span class=&p&&));&/span&
&span class=&k&&end&/span&
&span class=&c&&% Elapsed time is 0.395223 seconds.&/span&
&/code&&/pre&&/div&但这样显然不过瘾,那就把内层外层一起向量化吧:&br&&div class=&highlight&&&pre&&code class=&language-matlab&&&span class=&n&&totalDist&/span& &span class=&p&&=&/span& &span class=&n&&sum&/span&&span class=&p&&(&/span&&span class=&n&&dmat&/span&&span class=&p&&([&/span&&span class=&nb&&ones&/span&&span class=&p&&(&/span&&span class=&n&&popSize&/span&&span class=&p&&,&/span&&span class=&mi&&1&/span&&span class=&p&&)&/span& &span class=&n&&pop&/span&&span class=&p&&(:,&/span&&span class=&mi&&1&/span&&span class=&p&&:&/span&&span class=&k&&end&/span&&span class=&o&&-&/span&&span class=&mi&&1&/span&&span class=&p&&)]&/span&&span class=&o&&+&/span&&span class=&p&&(&/span&&span class=&n&&pop&/span&&span class=&o&&-&/span&&span class=&mi&&1&/span&&span class=&p&&)&/span&&span class=&o&&*&/span&&span class=&n&&mDmat&/span&&span class=&p&&),&/span&&span class=&mi&&2&/span&&span class=&p&&);&/span&
&span class=&c&&% Elapsed time is 0.256587 seconds.&/span&
&/code&&/pre&&/div&这里有大块的索引运算(pop(:,1:end-1))和cat运算([]),通常这样的运算会比较消耗时间,可以考虑避免,首先将求和的两部分分开来写避免cat运算:&br&&div class=&highlight&&&pre&&code class=&language-matlab&&&span class=&n&&totalDist&/span& &span class=&p&&=&/span& &span class=&n&&dmat&/span&&span class=&p&&((&/span&&span class=&n&&pop&/span&&span class=&p&&(:,&/span&&span class=&mi&&1&/span&&span class=&p&&)&/span&&span class=&o&&-&/span&&span class=&mi&&1&/span&&span class=&p&&)&/span&&span class=&o&&*&/span&&span class=&n&&mDmat&/span&&span class=&o&&+&/span&&span class=&mi&&1&/span&&span class=&p&&)&/span&&span class=&o&&+&/span&&span class=&c&&...&/span&
&span class=&n&&sum&/span&&span class=&p&&(&/span&&span class=&n&&dmat&/span&&span class=&p&&(&/span&&span class=&n&&pop&/span&&span class=&p&&(:,&/span&&span class=&mi&&1&/span&&span class=&p&&:&/span&&span class=&k&&end&/span&&span class=&o&&-&/span&&span class=&mi&&1&/span&&span class=&p&&)&/span&&span class=&o&&+&/span&&span class=&p&&(&/span&&span class=&n&&pop&/span&&span class=&p&&(:,&/span&&span class=&mi&&2&/span&&span class=&p&&:&/span&&span class=&k&&end&/span&&span class=&p&&)&/span&&span class=&o&&-&/span&&span class=&mi&&1&/span&&span class=&p&&)&/span&&span class=&o&&*&/span&&span class=&n&&mDmat&/span&&span class=&p&&),&/span&&span class=&mi&&2&/span&&span class=&p&&);&/span&
&span class=&c&&% Elapsed time is 0.254859 seconds.&/span&
&/code&&/pre&&/div&这样虽然避免了cat运算,但是又引入了一个大块的索引运算(pop(:,2:end)),所以可以看到性能并没有什么变化,可以进一步考虑消除索引运算:&br&&div class=&highlight&&&pre&&code class=&language-matlab&&&span class=&n&&totalDist2&/span& &span class=&p&&=&/span& &span class=&n&&dmat&/span&&span class=&p&&((&/span&&span class=&n&&pop&/span&&span class=&p&&(:,&/span&&span class=&mi&&1&/span&&span class=&p&&)&/span&&span class=&o&&-&/span&&span class=&mi&&1&/span&&span class=&p&&)&/span&&span class=&o&&*&/span&&span class=&n&&mDmat&/span&&span class=&o&&+&/span&&span class=&mi&&1&/span&&span class=&p&&)&/span&&span class=&o&&+&/span&&span class=&c&&...&/span&
&span class=&n&&sum&/span&&span class=&p&&(&/span&&span class=&n&&dmat&/span&&span class=&p&&(&/span&&span class=&n&&conv2&/span&&span class=&p&&(&/span&&span class=&n&&pop&/span&&span class=&p&&,[&/span&&span class=&n&&mDmat&/span& &span class=&mi&&1&/span&&span class=&p&&],&/span&&span class=&s&&'valid'&/span&&span class=&p&&)&/span&&span class=&o&&-&/span&&span class=&n&&mDmat&/span&&span class=&p&&),&/span&&span class=&mi&&2&/span&&span class=&p&&);&/span&
&span class=&c&&% Elapsed time is 0.227807 seconds.&/span&
&/code&&/pre&&/div&可以看到性能提升了10%,另外需要注意上边两种分块求和再相加的运算与放在一起求和的计算结果略有不同,浮点数计算误差导致的,这种相对误差很小,一般不影响运算&br&其实索引部分的运算还可以写的更紧凑一些:&br&&div class=&highlight&&&pre&&code class=&language-matlab&&&span class=&n&&totalDist&/span& &span class=&p&&=&/span& &span class=&n&&sum&/span&&span class=&p&&(&/span&&span class=&n&&dmat&/span&&span class=&p&&(&/span&&span class=&n&&filter&/span&&span class=&p&&([&/span&&span class=&n&&mDmat&/span& &span class=&mi&&1&/span&&span class=&p&&],&/span&&span class=&mi&&1&/span&&span class=&p&&,&/span&&span class=&n&&pop&/span&&span class=&p&&,&/span&&span class=&mi&&1&/span&&span class=&p&&,&/span&&span class=&mi&&2&/span&&span class=&p&&)&/span&&span class=&o&&-&/span&&span class=&n&&mDmat&/span&&span class=&p&&),&/span&&span class=&mi&&2&/span&&span class=&p&&);&/span&
&span class=&c&&% Elapsed time is 0.298399 seconds.&/span&
&/code&&/pre&&/div&但是可以看到这种方法是以上几种向量化方法中性能最低的,但是还是明显要快于原始的循环方法。&br&不过在这个问题中向量化有个问题,就是要生成一个和pop差不多大的矩阵用于求和,当pop足够大的时候开辟这么大的空间也是很消耗时间的,所以重新考虑下循环的方法。由于MATLAB的矩阵存储顺序是列优先,所以沿着列方向运算通常要快一些,自然想到下边的方法:&br&&div class=&highlight&&&pre&&code class=&language-matlab&&&span class=&n&&totalDist&/span& &span class=&p&&=&/span& &span class=&n&&dmat&/span&&span class=&p&&(&/span&&span class=&mi&&1&/span&&span class=&p&&,&/span&&span class=&n&&pop&/span&&span class=&p&&(:,&/span&&span class=&mi&&1&/span&&span class=&p&&)).&/span&&span class=&o&&'&/span&&span class=&p&&;&/span&
&span class=&k&&for&/span& &span class=&n&&k&/span& &span class=&p&&=&/span& &span class=&mi&&2&/span&&span class=&p&&:&/span&&span class=&n&&n&/span&
&span class=&n&&totalDist&/span& &span class=&p&&=&/span& &span class=&n&&totalDist&/span& &span class=&o&&+&/span& &span class=&n&&dmat&/span&&span class=&p&&(&/span&&span class=&n&&pop&/span&&span class=&p&&(:,&/span&&span class=&n&&k&/span&&span class=&o&&-&/span&&span class=&mi&&1&/span&&span class=&p&&)&/span&&span class=&o&&+&/span&&span class=&n&&mDmat&/span&&span class=&o&&*&/span&&span class=&p&&(&/span&&span class=&n&&pop&/span&&span class=&p&&(:,&/span&&span class=&n&&k&/span&&span class=&p&&)&/span&&span class=&o&&-&/span&&span class=&mi&&1&/span&&span class=&p&&));&/span&
&span class=&k&&end&/span&
&span class=&c&&% Elapsed time is 0.186153 seconds.&/span&
&/code&&/pre&&/div&可以看到这样的循环比上边任何一种向量化方法都要快。不过你可以发现这里的循环次数为n-1,于是可以预见,如果n远大于popSize时上述循环性能就会不如其他方法,在我这里测试,上述例子中其他参数不变,将n改为3e4,popSize取300,两者相差100倍时,该方法性能与第三种向量化算法性能差不多,而当n取3e5,popsize取30的时候这种方法就明显比向量化方法慢了&br&所以说优化MATLAB程序时向量化只是一种手段,并不是目标。上边的例子说明循环并不一定比向量化慢,当然你有可能找到一种新的向量化方法比上边最快的那个循环在任何情况下都快,但是你不能保证每次遇到问题你都能找到这样的向量化方法。所以优化的目标归根结底是提升程序的性能,对于性能敏感的程序最好还是具体情况具体分析(例如这里的pop的size),而不是一味的追求向量化。
从你给的例子中不能明确知道dmat和pop到底是矩阵还是函数,但是从你“矩阵里还嵌套矩阵”这句话中推断dmat和pop大概都是数组,以下所有程序都只针对dmat和pop都是数组的情况,如果不是这样你需要给出dmat函数或者pop函数的内容。因为你没有给定size,所以假…
已有帐号?
无法登录?
社交帐号登录查看: 2685|回复: 8|关注: 0
如何让matlab for循环只输出最后一个矩阵
它每次都会输出全部的矩阵,而我只要它输出的最后一个矩阵
function luxian(a,b)
for k=b:a& &
& & x=nchoosek(m,k);
& & [s,t]=size(x);
& & [p,q]=size(y);&&
& & z=zeros(s+p,a);
& & z(1:p,1:q)=y;
& & z((p+1):s+p,1:t)=x;& &
我在线等答安,拜托了。
关注者: 87
如果你的函数严格如这里所写,那么理应不会输出显示任何内容。你首先需要准确定位输出是由哪些语句造成的。另外,你的问题一般来说是由于循环中有某条语句没有加分号导致的。
这一行我打错了,本来没有分号。
但是去了这分号,它FOR循环的结果每次都会出来,而我只要它最后一次出的那结果
|此回复为最佳答案
苦楝 发表于
这一行我打错了,本来没有分号。
但是去了这分号,它FOR循环的结果每次都会出来,而我只要它最后一次 ...
那就只需要在你现在的基础上最后单独一行加个 y 即可。
哦哦,谢谢你哈,我去试
liuyunfeng 发表于
那就只需要在你现在的基础上最后单独一行加个 y 即可。
真的可以,这么简单,感觉自己好笨哦。:'(
苦楝 发表于
真的可以,这么简单,感觉自己好笨哦。
能说说你这个程序的到底想要算什么呢?
施文哲 发表于
能说说你这个程序的到底想要算什么呢?
luxian(3,2)
& &&&1& &&&2& &&&0
& &&&1& &&&3& &&&0
& &&&2& &&&3& &&&0
& &&&1& &&&2& &&&3
我作了修改,这是执行完后的结果。每行最多3个非0数,最少2个非0数,且每行第一个数是该行中最小的数
站长推荐 /1
Powered bymatlab中循环改成矩阵运算的问题_百度知道
matlab中循环改成矩阵运算的问题
r.^4,r,也是已知的,r;.^2,想改成矩阵运算如果r和l都是一个m*n的矩阵.^5],l,l,已知,l.^4,r和l都是一个数之前用多项式拟合得到了系数阵M,得到的result也是一个值,现在利用M来计算resultM是一个6*6的系数阵;
我现在是循环来求;Y是一个6*1的矩阵,已知;
Y=[1,l。但是这样太慢了.^3,l,r;
result= X * M * Y.^2,怎么计算result.^3。X是一个1*6的矩阵?result得到的也是一个m*n的矩阵.^5]&#39。求resultX=[1,不用循环,r
提问者采纳
);=&nbsp.^2+Rc.^2;Lc&nbsp.^2,&n]);R(,&=&nbsp.^2这样复杂;=&nbsp.*Lc+Lc:)有点麻烦;size(R);reshape(RResult&Resultc&nbsp.*l+l;n]&L(。我举个简单例子吧把X*M*Y展开成一个多项式;2+Rc。:[m;但是;[m&然后代码如下;&nbsp,所以这一行会写很长。;=&nbsp,比如2+r^2+r,实际上的式子远比2+r^2+r.*l+l;Rc&=&nbsp。
是个解决办法,这么写会比在循环里快很多吗?前面的处理中m*n的大循环是不可避免的,我现在是在循环里单个计算的。如果不计算,只是记录在m*n的矩阵中,循环结束以后再计算,这么做有必要吗?我是说在效率上会有明显的加速吗?
“如果不计算,只是记录在m*n的矩阵中,循环结束以后再计算”我不理解这句话的含义。至于到底加速效果如何,取决于你现在的实现,建议你把核心的代码贴出来看看。
result=X*M*Y它其实就是利用一个多项式拟合的结果来计算的,M相当于是多项式的系数。我是处理M行n列的图像。对每个点循环进行区域增长的处理,这个大循环不可避免,我现在是在循环里一个循环处理一次X*M*Y。我是在考虑,如果单独把result=X*M*Y提到循环外面,究竟会加速多少?会加速很多吗?因为现在还在写前面的算法,在验证结果的时候感觉很慢,想加快一点。
我不能理解”单独把result=X*M*Y提到循环外面“的含义和影响。如果能够把这个运算提出来,不改变循环体的其他部分,当然可以加速。至于加速多少:这个运算是纯粹的矩阵运算,这正是matlab的擅长之处。所以,仅仅这句话本身,不会耗费很多时间。
提问者评价
明白了,我还是放在循环里吧,不折腾了,应该也慢不了多少。多谢~
来自团队:
其他类似问题
为您推荐:
其他1条回答
是否矩阵,完全不需要放到循环中呀不需要这么麻烦吧!不管r&#47。我不知道为什么不可以,都可以向你给出的那样直接计算的!!
matlab的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁

我要回帖

更多关于 matlab矩阵for循环 的文章

 

随机推荐