Matlab算法转换坐标

时间:2018-07-31 17:39:45

标签: matlab

假设我在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

1 个答案:

答案 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

您可以看到,如果jh为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=s1j=s2时,我们已经用尽了第一个平面,并开始在第二个平面(h=2)中查找元素。 k将因此增加s1*s2,以访问此平面中的所有元素。因此:

k = i + (j-1)*s1 + (h-1)*s1*s2;

可以稍微简化一下

k = i + ( j-1 + (h-1)*s2 ) * s1;

sub2ind执行相同的计算,尽管该功能比手动写出计算要多一些开销。