performance - 在Matlab中获取每个子矩阵n列与新矩阵中的列一样长

标签 performance matlab matrix

我正在处理非常大的数据集(数十万列,14 行),我需要让每个子矩阵的 n 列与新矩阵中的列一样长,即

1 3 5 7
2 4 6 8

成为

1 3 5
2 4 6
3 5 7
4 6 8

当 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));

但是这个方法比较慢。我如何使用原生 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 

对于 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))

sample 运行-

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

关于performance - 在Matlab中获取每个子矩阵n列与新矩阵中的列一样长,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31375217/

相关文章:

linux - Linux 上应用程序的环境性能参数

python - 处理大型 CSV 文件的文件夹

r - 如果 R 中行 <0 或 >0 中的两个数字,如何根据条件对矩阵进行子集化?

将方程式转换为位移运算

python - 为什么 itertools.groupby() 比使用 defaultdict 的等效方法慢得多?

python - 可在当前命名空间中转储的可挑选数据容器

matlab - "Don' t care"内核中用于二元形态树修剪的元素,MATLAB

python - 如何从python numpy中的矩阵中获取 float

r - R中一类分类变量的相关矩阵

java - 为什么 "while (i++ < n) {}"明显比 "while (++i < n) {}"慢