假设我在Matlab中有一个大小为A
的矩阵MxNxK
。假设我在列向量A
中变换B
。我想要一个代码,给定i,j,h
中第A
个元素的坐标,可以拆分k
中相同元素的坐标B
。
我写了一个代码,可以完成我想要的。由于我正在尽力优化代码(坐标操作的更改应被拒绝数百万次),因此我想知道您是否可以想到更有效的解决方案。
让我用一个例子更好地解释。
clear all
A(:,:,1)=[1 2 3; 4 5 6];
A(:,:,2)=[7 8 9; 10 11 12];
A(:,:,3)=[13 14 15; 16 17 18];
A(:,:,4)=[19 20 21; 22 23 24];
B=reshape(A,[24,1]);
假设changecoord(i,j,h)
是给出位置的函数
A(i,j,h)
中的B
然后,该算法应拆分
%changecoord(1,1,1)=1
%changecoord(2,1,1)=2
%changecoord(1,2,1)=3
%changecoord(2,2,1)=4
%changecoord(1,3,1)=5
%changecoord(2,3,1)=6
%changecoord(1,1,2)=7
%changecoord(2,1,2)=8
%changecoord(1,2,2)=9
%changecoord(2,2,2)=10
%changecoord(1,3,2)=11
%changecoord(2,3,2)=12
%changecoord(1,1,3)=13
%changecoord(2,1,3)=14
%changecoord(1,2,3)=15
%changecoord(2,2,3)=16
%changecoord(1,3,3)=17
%changecoord(2,3,3)=18
%changecoord(1,1,4)=19
%changecoord(2,1,4)=20
%changecoord(1,2,4)=21
%changecoord(2,2,4)=22
%changecoord(1,3,4)=23
%changecoord(2,3,4)=24
这是我写的算法
function k=changecoord(s1, s2,i,j,h)
%s1=size(A,1)
%s2=size(A,2)
p1=(s1*s2)*h-(s1*s2)+1:1:s1*s2*h;
p2=p1(s2*j-s2+1:s2*j);
k=p2(i);
end
答案 0 :(得分:1)
您的函数效率不高,因为它会创建一个(可能是)大型数组,然后在其中找到一个值:
function k=changecoord(s1, s2,i,j,h)
%s1=size(A,1)
%s2=size(A,2)
p1=(s1*s2)*h-(s1*s2)+1:1:s1*s2*h;
p2=p1(s2*j-s2+1:s2*j);
k=p2(i);
end
您可以看到,如果j
和h
为1,则k==i
。这对i
范围内的所有1:s1
值均有效。内存中的下一个元素再次具有i=1
,但还有j=2
。在这里,k=s1+1
。也就是说,k=s1+i
用于所有j=2
的元素。当j=3
变成k=2*s1+i
,依此类推。因此在2D索引中:
k = i + (j-1)*s1;
对于下一个索引,我们可以完全相同。当i=s1
和j=s2
时,我们已经用尽了第一个平面,并开始在第二个平面(h=2
)中查找元素。 k
将因此增加s1*s2
,以访问此平面中的所有元素。因此:
k = i + (j-1)*s1 + (h-1)*s1*s2;
可以稍微简化一下
k = i + ( j-1 + (h-1)*s2 ) * s1;
sub2ind
执行相同的计算,尽管该功能比手动写出计算要多一些开销。