Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/16.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_Matrix - Fatal编程技术网

matlab中的矩阵重组

matlab中的矩阵重组,matlab,matrix,Matlab,Matrix,我在matlab中有一个矩阵x,它有6*n*n*3行和一列,代表6*n*n点的三维坐标。坐标的排列方式为:行1:6*n*n是x坐标,行6*n*n+1:12*n*n是y坐标,行12*n*n+1:18*n*n是z坐标 我想从中构建两个新矩阵,一个简单地将给定点的x,y,z坐标放在一起,另一个的行I由点I减去其他点组成 现在,我正在使用双for循环来实现这一点,对于n>16,这个循环非常慢。使用matlab向量/矩阵功能有更好/更快的方法吗 这是我当前的代码 x=x(1:6*n*n); y=y(6*n

我在matlab中有一个矩阵x,它有6*n*n*3行和一列,代表6*n*n点的三维坐标。坐标的排列方式为:行1:6*n*n是x坐标,行6*n*n+1:12*n*n是y坐标,行12*n*n+1:18*n*n是z坐标

我想从中构建两个新矩阵,一个简单地将给定点的x,y,z坐标放在一起,另一个的行I由点I减去其他点组成

现在,我正在使用双for循环来实现这一点,对于n>16,这个循环非常慢。使用matlab向量/矩阵功能有更好/更快的方法吗

这是我当前的代码

x=x(1:6*n*n);
y=y(6*n*n+1:12*n*n);
z=z(12*n*n+1:18*n*n);
N=6*n*n;
points=[];
difs=[];
for i=1:N
    difrow=[];
    points=[points;x(i) y(i) z(i)];
    for j=1:N
       deltax=x(i)-x(j);
       deltay=y(i)-y(j);
       deltaz=z(i)-z(j);
       difrow=[difrow deltax deltay deltaz];
    end  

    difs=[difs;difrow];
end 

我不知道你们的数据是什么样子的,但让我们尝试一下简单的事情,然后我最终会扩展我的答案

第一个微优化:始终将中间结果缓存在Matlab中,以提高循环时的性能

x = x(1:6*n*n);
y = y(6*n*n+1:12*n*n);
z = z(12*n*n+1:18*n*n);

points = [];
difs = [];

for i=1:N
    difrow = [];

    x_i = x(i);
    y_i = y(i);
    z_i = z(i);

    points = [points; x_i y_i z_i];

    for j=1:N
       deltax = x_i - x(j);
       deltay = y_i - y(j);
       deltaz = z_i - z(j);

       difrow = [difrow deltax deltay deltaz];
    end  

    difs=[difs; difrow];
end
第二次微优化:预先实例化阵列以避免内联内存重新分配

x = x(1:6*n*n);
y = y(6*n*n+1:12*n*n);
z = z(12*n*n+1:18*n*n);

points = NaN(N,1);
difs = [];

for i=1:N
    x_i = x(i);
    y_i = y(i);
    z_i = z(i);

    points(i) = [x_i y_i z_i];

    difrow = NaN(N,1);

    for j=1:N
       deltax = x_i - x(j);
       deltay = y_i - y(j);
       deltaz = z_i - z(j);

       difrow(j) = [deltax deltay deltaz];
    end  

    difs = [difs; difrow];
end

您可以避免使用循环、数组整形和串联(假设
x,y,z
是大小为
[N x 1]
的列向量):

或者在最新版本的MATLAB中,您可以执行以下操作:

points = [x y z];
deltax = x.' - x;
deltay = y.' - y;
deltaz = z.' - z;
difs   = reshape([deltax(:) deltay(:) deltaz(:)].',N*3,[]).';

我做了这些。它稍微改善了一些,但对于n=20,即2400点,需要4分钟,我需要到n=36左右。对于这么多点,4分钟并不长,但因为我不知道你在尝试做什么,以及你的数据是什么样子,很难为代码开发一个全新的逻辑,以便以更快的性能获得相同的结果。点需要是一个由N行(每个点一行)和3列(每个点坐标一列)组成的矩阵。上面的代码给出了一个点矩阵,有一行和3*N列。没有x、y、z是每N行长。它们的OK大小是
[1 x N]
points = [x y z];
deltax = x.' - x;
deltay = y.' - y;
deltaz = z.' - z;
difs   = reshape([deltax(:) deltay(:) deltaz(:)].',N*3,[]).';