在我的脚本中,我生成一个矩阵,其中每列与至少另一列耦合。例如,第1列与第2列耦合,第3列与第4列耦合等等。但我也可以将第3列乘以3或4乘以4或任何其他数字。
目前这只是一个图像,但我想在自己的行上移动耦合列,这样我就可以使用any()或sum()轻松混合它们。
这个例子会更清楚:
A = reshape(1:12, 3, []) % A is the matrix I start with, this reshape is OK
A =
1 4 7 10
2 5 8 11
3 6 9 12
reshape(A, [], 2) % this reshape is not OK
ans =
1 7
2 8
3 9
4 10
5 11
6 12
但是,我希望答案是:
ans =
1 4
2 5
3 6
7 10
8 11
9 12
正如我所说,这个例子只适用于2列,但在我的用例中我还需要支持任意数量的列对。这里有3列:
B = reshape(1:18, 3, [])
B =
1 4 7 10 13 16
2 5 8 11 14 17
3 6 9 12 15 18
reshape(B, [], 3)
ans =
1 7 13
2 8 14
3 9 15
4 10 16
5 11 17
6 12 18
我想要的是什么:
ans =
1 4 7
2 5 8
3 6 9
10 13 16
11 14 17
12 15 18
有没有办法以矢量化的方式做到这一点?
答案 0 :(得分:4)
假设M
是输入矩阵,看看这是否适合你 -
ncols = 2; %// number of columns (needs to be edited)
[m,n] = size(M) %// get size of input matrix for later usage
r = numel(M)/(m*ncols);
out = reshape(permute(reshape(M,m,ncols,[]),[1 3 2]),m*r,[])
样品运行 -
M =
1 4 7 10
2 5 8 11
3 6 9 12
ncols =
2
out =
1 4
2 5
3 6
7 10
8 11
9 12
和
M =
1 4 7 10 13 16
2 5 8 11 14 17
3 6 9 12 15 18
ncols =
3
out =
1 4 7
2 5 8
3 6 9
10 13 16
11 14 17
12 15 18
按照你的话 - "column 1 is coupled with column 2, column 3 is coupled with column 4, etc... But I could also couple columns 3 by 3 or 4 by 4 or any other number"
,我感觉你可能实际上想要形成输入矩阵列的所有可能组合,并垂直连接它们以形成细长的矩阵作为输出。该部分解决方案将涵盖该基础。实现这一目标的代码(如果你希望这意味着什么)
会是这样的 -
ncols = 2; %// number of columns (needs to be edited)
[m,n] = size(M) %// get size of input matrix for later usage
combs = dec2base(0:n^2-1,n,ncols)-'0'+1 %// find combinations
combsp = permute(combs,[3 2 1]) %// make a 3D array of those combinations
idx = bsxfun(@plus,[1:m]',(combsp-1)*m) %//'# Indices as a 3D array
idx1 = reshape(permute(idx,[1 3 2]),m*size(idx,3),[]) %// vertically concatenate
%// 3D indices array into a 2D array
out = M(idx1) %// desired output
一个样本运行 -
M =
6 7 3 6
3 1 6 3
5 1 4 2
ncols = 2
out =
6 6
3 3
5 5
6 7
3 1
5 1
6 3
3 6
5 4
6 6
3 3 ....
答案 1 :(得分:1)
首先,尽管基本上可以具有N维 稀疏对象,Octave稀疏类不允许它们 时间;稀疏类的所有实例必须是2维的。这个 意味着SparseMatrix实际上更类似于Octave的Matrix 类比它的NDArray类。
唯一的解决方法是使用基于循环的解决方案,如此函数:
function B = vertical_tile(A, ncols)
B = [];
if issparse(A)
B = sparse(B);
end
for i=1:ncols
B = [B A(:, i:ncols:end)];
end
B = reshape(B, [], ncols);
end
结果:
vertical_tile(A, 2)
ans =
1 4
2 5
3 6
7 10
8 11
9 12
vertical_tile(B, 3)
ans =
1 4 7
2 5 8
3 6 9
10 13 16
11 14 17
12 15 18