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