Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
坐标变换的Matlab算法_Matlab - Fatal编程技术网

坐标变换的Matlab算法

坐标变换的Matlab算法,matlab,Matlab,假设我在Matlab中有一个矩阵a,大小为MxNxK。假设我在列向量B中变换A,我想要一个代码,给定A中I,j,hth元素的坐标,将B中相同元素的坐标k分开 我已经写了一个代码,可以实现我想要的。由于我正在尽可能地优化我的代码,坐标操作的更改应该被重新处理数百万次,我想知道您是否可以想出更有效的解决方案 让我用一个例子更好地解释一下 clear all A(:,:,1)=[1 2 3; 4 5 6]; A(:,:,2)=[7 8 9; 10 11 12]; A(:,:,3)=[13 14 15

假设我在Matlab中有一个矩阵a,大小为MxNxK。假设我在列向量B中变换A,我想要一个代码,给定A中I,j,hth元素的坐标,将B中相同元素的坐标k分开

我已经写了一个代码,可以实现我想要的。由于我正在尽可能地优化我的代码,坐标操作的更改应该被重新处理数百万次,我想知道您是否可以想出更有效的解决方案

让我用一个例子更好地解释一下

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]);
假设changecordi,j,h是给出 B中的Ai,j,h

然后,这个算法应该拆分

%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

您的函数将没有效率,因为它创建了一个可能较大的数组,然后在其中找到一个值:

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。也就是说,对于j=2的所有元素,k=s1+i。当j=3时,变为k=2*s1+i,以此类推。因此,在二维索引中:

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;
同样的计算是由执行的,尽管该函数的开销比手工写出计算要多一点