Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/13.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
Performance 在matlab中对三维阵列进行转置和整形_Performance_Matlab_Multidimensional Array_Vectorization - Fatal编程技术网

Performance 在matlab中对三维阵列进行转置和整形

Performance 在matlab中对三维阵列进行转置和整形,performance,matlab,multidimensional-array,vectorization,Performance,Matlab,Multidimensional Array,Vectorization,假设我有一个大小为n×p×q的数组X。我想把它重塑成一个有p行的矩阵,在每一行中把大小为q的n行串联起来,得到大小为p乘以nq的矩阵 我试着用一个循环来做,但是如果n=1000,p=300,q=300,需要一段时间 F0=[]; for k=1:size(F,1) F0=[F0,squeeze(X(k,:,:))]; end 有没有更快的方法?我想这就是你想要的: Y = reshape(permute(X, [2 1 3]), size(X,2), []); 示例为n=2,p=3,

假设我有一个大小为n×p×q的数组X。我想把它重塑成一个有p行的矩阵,在每一行中把大小为q的n行串联起来,得到大小为p乘以nq的矩阵

我试着用一个循环来做,但是如果n=1000,p=300,q=300,需要一段时间

F0=[];
for k=1:size(F,1)
    F0=[F0,squeeze(X(k,:,:))];
end

有没有更快的方法?

我想这就是你想要的:

Y = reshape(permute(X, [2 1 3]), size(X,2), []);
示例为
n=2
p=3
q=4

>> X
X(:,:,1) =
     0     6     9
     8     3     0
X(:,:,2) =
     4     7     1
     3     7     4
X(:,:,3) =
     4     7     2
     6     7     6
X(:,:,4) =
     6     1     9
     1     4     3

>> Y = reshape(permute(X, [2 1 3]), size(X,2), [])
Y =
     0     8     4     3     4     6     6     1
     6     3     7     7     7     7     1     4
     9     0     1     4     2     6     9     3

我想这就是你想要的:

Y = reshape(permute(X, [2 1 3]), size(X,2), []);
示例为
n=2
p=3
q=4

>> X
X(:,:,1) =
     0     6     9
     8     3     0
X(:,:,2) =
     4     7     1
     3     7     4
X(:,:,3) =
     4     7     2
     6     7     6
X(:,:,4) =
     6     1     9
     1     4     3

>> Y = reshape(permute(X, [2 1 3]), size(X,2), [])
Y =
     0     8     4     3     4     6     6     1
     6     3     7     7     7     7     1     4
     9     0     1     4     2     6     9     3
试试这个-

reshape(permute(X,[2 3 1]),p,[])
因此,对于代码验证,可以查看示例运行情况-

n = 2;
p = 3;
q = 4;

X = rand(n,p,q)
F0=[];
for k=1:n
    F0=[F0,squeeze(X(k,:,:))];
end
F0

F0_noloop = reshape(permute(X,[2 3 1]),p,[])
输出为-

F0 =
    0.4134    0.6938    0.3782    0.4775    0.2177    0.0098    0.7043    0.6237
    0.1257    0.8432    0.7295    0.2364    0.3089    0.9223    0.2243    0.1771
    0.7261    0.7710    0.2691    0.8296    0.7829    0.0427    0.6730    0.7669
F0_noloop =
    0.4134    0.6938    0.3782    0.4775    0.2177    0.0098    0.7043    0.6237
    0.1257    0.8432    0.7295    0.2364    0.3089    0.9223    0.2243    0.1771
    0.7261    0.7710    0.2691    0.8296    0.7829    0.0427    0.6730    0.7669
试试这个-

reshape(permute(X,[2 3 1]),p,[])
因此,对于代码验证,可以查看示例运行情况-

n = 2;
p = 3;
q = 4;

X = rand(n,p,q)
F0=[];
for k=1:n
    F0=[F0,squeeze(X(k,:,:))];
end
F0

F0_noloop = reshape(permute(X,[2 3 1]),p,[])
输出为-

F0 =
    0.4134    0.6938    0.3782    0.4775    0.2177    0.0098    0.7043    0.6237
    0.1257    0.8432    0.7295    0.2364    0.3089    0.9223    0.2243    0.1771
    0.7261    0.7710    0.2691    0.8296    0.7829    0.0427    0.6730    0.7669
F0_noloop =
    0.4134    0.6938    0.3782    0.4775    0.2177    0.0098    0.7043    0.6237
    0.1257    0.8432    0.7295    0.2364    0.3089    0.9223    0.2243    0.1771
    0.7261    0.7710    0.2691    0.8296    0.7829    0.0427    0.6730    0.7669

您不必使用矢量化来解决问题,而是可以查看代码来尝试找出可以提高性能的方法。在这种情况下,由于您知道输出矩阵
F0
的大小应该是px(n*q),因此可以将内存预分配给
F0
,并避免在
for
循环的每次迭代中不断调整矩阵的大小

n=1000; 
p=300; 
q=300;

F0=zeros(p,n*q);

for k=1:size(F,1)
    F0(:,(k-1)*q+1:k*q) = squeeze(F(k,:,:));
end

虽然可能没有其他两种解决方案那么有效,但它是一种替代方案。试试上面的方法,看看会发生什么

不必使用矢量化来解决问题,您可以查看代码来尝试找出可以提高性能的方法。在这种情况下,由于您知道输出矩阵
F0
的大小应该是px(n*q),因此可以将内存预分配给
F0
,并避免在
for
循环的每次迭代中不断调整矩阵的大小

n=1000; 
p=300; 
q=300;

F0=zeros(p,n*q);

for k=1:size(F,1)
    F0(:,(k-1)*q+1:k*q) = squeeze(F(k,:,:));
end

虽然可能没有其他两种解决方案那么有效,但它是一种替代方案。试试上面的方法,看看会发生什么

你不需要另一个
[1 3 2]
?@Divakar-Hmm。。。实际上,我不知道OP想要什么。@Divakar谢谢!你已经有了我的+1来深入研究这个问题。我想有两种可能的方法来线性化剩下的两个维度,我们的答案不同,那就是你不需要另一个
[1 3 2]
?@Divakar-Hmm。。。实际上,我不知道OP想要什么。@Divakar谢谢!你已经有了我的+1来深入研究这个问题。我想有两种可能的方法来线性化剩下的两个维度,我们的答案在这方面有所不同