例如,我有一个矩阵A(图1)。当变量n = 2
时,我希望将其转换为矩阵B。红色矩形表示每列的转换规则。根据此规则,当n = 3
时,它可以成为矩阵C。
我已经使用for循环方法编写了一个脚本,但是当矩阵A非常大时(例如11688 * 140000),这是浪费时间。有解决此问题的有效方法吗?
图1:
答案 0 :(得分:2)
这是使用reshape
和implicit expansion
的一种方式:
result = reshape(A((1:size(A,1)-n+1) + (0:n-1).', :), n, []);
例如,假设n = 3
。隐式扩展用于提取行的索引:
row_ind = (1:size(A,1)-n+1) + (0:n-1).';
创建以下矩阵:
1 2
2 3
3 4
提取A
的所需行:
A_expanded = A(row_ind, :)
将矩阵row_ind
用作索引时,其行为类似于矢量:
1
2
1 2 3
2 3 -> 2
3 4 3
4
A_expanded =
3 5 7
6 8 9
2 6 3
6 8 9
2 6 3
1 2 1
现在A_expanded
可以调整为所需的大小:
result = reshape(A_expanded, n, []);
>>result =
3 6 5 8 7 9
6 2 8 6 9 3
2 1 6 2 3 1
答案 1 :(得分:1)
如果您拥有图像处理工具箱,则可以按以下方式使用im2col
:
result = im2col(A, [n 1], 'sliding');