Matlab 将长二维矩阵拆分为三维矩阵

Matlab 将长二维矩阵拆分为三维矩阵,matlab,matrix,multidimensional-array,vectorization,Matlab,Matrix,Multidimensional Array,Vectorization,假设我有以下矩阵: A = randi(10, [6 3]) 7 10 3 5 5 7 10 5 1 6 5 10 4 9 1 4 10 1 我想把每两行提取出来,放到三维空间中,结果如下: B(:,:,1) = 7 10 3 5 5 7 B(:,:,2) = 10 5 1

假设我有以下矩阵:

A = randi(10, [6 3])
     7    10     3
     5     5     7
    10     5     1
     6     5    10
     4     9     1
     4    10     1
我想把每两行提取出来,放到三维空间中,结果如下:

B(:,:,1) =
     7    10     3
     5     5     7
B(:,:,2) =
    10     5     1
     6     5    10
B(:,:,3) =
     4     9     1
     4    10     1
很明显,我可以用for循环来实现这一点,只是想知道如何使用置换/重塑/来更优雅地作为一个线性体。。(注意矩阵大小和步长必须为参数)


这是一个使用和的单线解决方案:

当然,这需要
newR
均匀地划分为
R

这是一个带and的单行程序,但不需要转换输入数组-

out = permute(reshape(A,newR,size(A,1)/newR,[]),[1 3 2]);
,其中
newR
3D
数组输出中的行数


标杆管理 本节将本篇文章中提出的方法与绩效评估方法进行比较。数据量与问题中列出的数据量成正比。因此,
A
的大小为
60000 x 300
,我们将对其进行拆分,以便
3D
输出将有
200行
,因此dim-3将有
300个
条目

基准测试代码-

%// Input
A = randi(10, [60000 300]); %// 2D matrix
newR = 200;                 %// New number of rows

%// Warm up tic/toc.
for k = 1:50000
    tic(); elapsed = toc();
end

N_iter = 5; %// Number of iterations for each approach to run with

disp('---------------------- With PERMUTE, RESHAPE & TRANSPOSE')
tic
for iter = 1:N_iter
    [R,C] = size(A);
    B = permute(reshape(A',[C newR R/newR]),[2 1 3]); %//'
end
toc, clear B R C iter

disp('---------------------- With PERMUTE & RESHAPE')
tic
for iter = 1:N_iter
    out = permute(reshape(A,newR,size(A,1)/newR,[]),[1 3 2]);
end
toc
输出-

-------------------------带置换、重塑和转置
运行时间为2.236350秒。
----------------------具有置换和重塑功能
运行时间为1.049184秒。

正是我需要的,谢谢!顺便说一句,你怎么能用行主键而不是列主键来索引矩阵(就像MATLAB那样)?MATLAB矩阵元素的线性索引总是遵循列主键顺序。如果要访问行中的元素,必须先转置矩阵,然后再执行线性索引。这就是为什么在上面的解决方案中,我将
A'
作为第一个重塑的参数。有关MATLAB中矩阵索引的更多信息,请查看以下链接:
out = permute(reshape(A,newR,size(A,1)/newR,[]),[1 3 2]);
%// Input
A = randi(10, [60000 300]); %// 2D matrix
newR = 200;                 %// New number of rows

%// Warm up tic/toc.
for k = 1:50000
    tic(); elapsed = toc();
end

N_iter = 5; %// Number of iterations for each approach to run with

disp('---------------------- With PERMUTE, RESHAPE & TRANSPOSE')
tic
for iter = 1:N_iter
    [R,C] = size(A);
    B = permute(reshape(A',[C newR R/newR]),[2 1 3]); %//'
end
toc, clear B R C iter

disp('---------------------- With PERMUTE & RESHAPE')
tic
for iter = 1:N_iter
    out = permute(reshape(A,newR,size(A,1)/newR,[]),[1 3 2]);
end
toc