我知道如何使用toeplitz函数在MATLAB中创建一个一维向量的循环矩阵。但是,我正在尝试创建一个循环块。
例如,我有3个大小矩阵(2,2,3),其中第三维是R,G,B:下面是每个矩阵的行和列的样本值。第一个矩阵:
# 01 02
# 03 04第二矩阵:
# 05 06
# 07 08第三矩阵:
# 09 10
# 11 12现在我要创建一个循环矩阵,如下所示
# 01 02 05 06 09 10
# 03 04 07 08 11 12
# 09 10 01 02 05 06
# 11 12 03 04 07 08
# 03 04 09 10 01 02
# 05 06 11 12 03 04注意,我希望能够在后面的行中将整个矩阵块移动到右边,而不仅仅是矩阵的第一行。请注意,我希望保留这些矩阵w(其中包含颜色维数)的第三维。
有人能告诉我怎么做吗?我想做一个数组,我已经有了一个3D矩阵,并且不知道如何在这里做一个数组,如果它有帮助的话。
参考文献:
发布于 2019-07-07 02:56:32
以下代码将线性索引作为两部分之和:
将此索引应用于原始矩阵会产生所需的结果。
data = cat(3, [1 2; 3 4], [5 6; 7 8], [9 10; 11 12]); % example data
[L, M, N] = size(data);
ind_outer = repelem(mod(bsxfun(@minus, 0:N-1, (0:N-1).'), N), L, M);
ind_inner = repmat(reshape(1:L*M, L, M), N, N);
ind = ind_outer*L*M + ind_inner;
result = data(ind);这给了我们
result =
1 2 5 6 9 10
3 4 7 8 11 12
9 10 1 2 5 6
11 12 3 4 7 8
5 6 9 10 1 2
7 8 11 12 3 4要更好地理解这是如何工作的,请参阅外部和内部索引模式(如果需要,请阅读有关线性索引的内容):
>> ind_outer
ind_outer =
0 0 1 1 2 2
0 0 1 1 2 2
2 2 0 0 1 1
2 2 0 0 1 1
1 1 2 2 0 0
1 1 2 2 0 0
>> ind_inner
ind_inner =
1 3 1 3 1 3
2 4 2 4 2 4
1 3 1 3 1 3
2 4 2 4 2 4
1 3 1 3 1 3
2 4 2 4 2 4https://stackoverflow.com/questions/56910614
复制相似问题