Has*_*ail 4 performance matlab matrix
我正在处理非常大的数据集(数十万列,14行),我需要将每个子矩阵n列作为新矩阵中的列,即
1 3 5 7
2 4 6 8
Run Code Online (Sandbox Code Playgroud)
变
1 3 5
2 4 6
3 5 7
4 6 8
Run Code Online (Sandbox Code Playgroud)
当n = 2时.
我现在拥有的是
n_data_points = size(data1, 1);
small_n = 60;
big_n = size(data1, 2);
new_2 = bsxfun(@(x,y)(data1(x + n_data_points * (y - 1))), (1:(n_data_points * small_n)).', 1:(big_n - small_n + 1));
Run Code Online (Sandbox Code Playgroud)
但这种方法相当慢.如何使用本机Matlab操作执行此操作?
编辑
因此,在对这里的一些方法进行基准测试并进行更多研究之后,我选择了以下内容:
n = 60;
[m, big_n] = size(data1);
a = zeros((m*n), (big_n - n + 1));
for i = 1:(big_n - n + 1)
a(:, i) = reshape(data1(:, i:(i + n - 1)), 1, m*n);
end
Run Code Online (Sandbox Code Playgroud)
使用14 x 387160矩阵时,此方法大约需要2.3秒,而我的原始方法需要大约4.8秒,而@Divakar大约需要3.9.
一种方法bsxfun使用linear indexing-
[m1,n1] = size(data1) %// Get size of input array data1
out = data1(bsxfun(@plus,[1:n*m1]',[0:n1-n]*m1))
Run Code Online (Sandbox Code Playgroud)
样品运行 -
data1 =
9 2 8 2 4 9 4
9 3 3 3 8 3 6
5 8 9 6 6 7 1
2 3 4 5 5 7 1
n =
3
out =
9 2 8 2 4
9 3 3 3 8
5 8 9 6 6
2 3 4 5 5
2 8 2 4 9
3 3 3 8 3
8 9 6 6 7
3 4 5 5 7
8 2 4 9 4
3 3 8 3 6
9 6 6 7 1
4 5 5 7 1
Run Code Online (Sandbox Code Playgroud)