Re: [请益]for循环内差法过慢

楼主: sunev (Veritas)   2017-06-23 18:18:39
※ 引述《s455164 (梦想家)》之铭言:
: 有点卡关..
: 我有三个阵列:
: 三维阵列A(100,100,51)、二维阵列B(100,100)、一维阵列C(1,51)
: 其中A阵列的第三个维度是与C互相呼应的(A(:,:,1)是对应C(1,1))
: 想要利用B阵列与C阵列之间的比例关系去对A阵列
: 内插出一个新的二维阵列A'(100,100)
: 我自己的写法是这样的
: A' = zeros(100,100);
A'这变量名称应该不合法吧?
以下改称AA
另外AA与k无关吗?
这样k循环不是只要跑最后一次就好?
先假设AA的大小为100*100*50;
首先把C的第二维换到第三维与A对齐
C=permute(C,[1 3 2]);
: for i = 1:100
: for j = 1:100
: for k = 1:51-1
先忽略条件式
: if ((B(i,j)>=C(k)) && (B(i,j)<=C(k+1))) || (((B(i,j)>=C(k)) && (B(i,j)>=C(k+1)
: A'(i,j) = (A(i,j,k+1)-A(i,j,k)) * (B(i,j)-C(k))/(C(k+1)-C(k)) + A(i,j,k);
此行可直接改写如下
AA1=A(:,:,1:end-1)+...
diff(A,1,3)*bsxfun(@rdivide,bsxfun(@minus,B,C(1,1,1:end-1)),diff(C,1,3));
: elseif (B(i,j) <= C(k)) && (B(i,j) < = C(k+1))
: A'(i,j) = A(i,j,k+1) - (A(i,j,k+1)-A(i,j,k)) * (C(k+1)-B(i,j))/(C(k+1)-C(k))
此行可直接改写如下
AA2=A(:,:,2:end)-...
diff(A,1,3)*bsxfun(@rdivide,bsxfun(@minus,C(1,1,2:end),B),diff(C,1,3));
: end
: end
: end
: end
: 可是发现计算时间真的太长了,要花到3个多小时...不知道可以如何改善
: 想请教如何解决,麻烦大家了
条件一似乎可化简成 (B(i,j)>=C(k))
现在想办法把AA1和AA2在我们想要的条件下合并起来
AA=zeros(size(AA1));
ind1=bsxfun(@ge,B,C(1,1,1:end-1));
ind2=bsxfun(@le,B,C(1,1,1:end-1))&bsxfun(@le,B,C(1,1,2:end));
AA(ind2)=AA2(ind2); AA(ind1)=AA1(ind1);
最后可把C的维度转回来,如果你怕之后会忘记的话
C=permute(C,[1 3 2]);
作者: s455164 (梦想家)   2017-06-23 22:52:00
阿不好意思 对其实以matlab的写法 应该要表示为AA好的 那我回去试看看 感谢你AA不会随k变动但是AA上的元素,例如AA( 1 , 2 )是先判断 B阵列的B( 1 ,2 ) 的值是介在C阵列中的哪个位置后[假如是C(4) < B(1,2 ) < C(5)],再提出相对应位置的A(1,2,4)&A(1,2,5)去内插出AA(1,2)这样
楼主: sunev (Veritas)   2017-06-24 07:40:00
所以在所有k里取最后条件成立的值?
作者: s455164 (梦想家)   2017-06-24 09:13:00
取最后k维度出来的值 再丢回相对应的AA( i , j )之中所以AA阵列上的每个元素需要用到的C(k)都是不一样的,我有想过是让A阵列以A(:,:,K)计算到一个新的阵列A1里,再只挑要的位置出来提到AA中[AA(i,j)=A1(i,j]但是这样好像更慢..就不行了
楼主: sunev (Veritas)   2017-06-24 11:49:00
你的C是排序过的吗?
作者: s455164 (梦想家)   2017-06-24 12:14:00
对喔 C是已经整理过的http://i.imgur.com/tMCtsR4.jpg

Links booklink

Contact Us: admin [ a t ] ucptt.com