厚厚的家伙的另一个问题(我)...道歉 - 非常感谢!
以下是较大矩阵的示例示例
0 1.0000 1.0000 60.0000 100.0000 0 0.2500
0 1.0000 1.0000 62.0000 100.0000 0.2500 0.2500
0 1.0000 1.0000 63.0000 100.0000 0.5000 0.2500
1.0000 1.0000 1.0000 58.0000 100.0000 0.7500 0.2500
1.0000 1.0000 1.0000 59.0000 100.0000 1.0000 0.2500
1.0000 1.0000 1.0000 65.0000 100.0000 1.2500 0.2500
2.0000 1.0000 1.0000 55.0000 100.0000 1.5000 0.2500
2.0000 1.0000 1.0000 57.0000 100.0000 1.7500 0.2500
2.0000 1.0000 1.0000 60.0000 100.0000 2.0000 0.2500
3.0000 1.0000 1.0000 54.0000 100.0000 2.2500 0.2500
3.0000 1.0000 1.0000 55.0000 100.0000 2.5000 0.2500
3.0000 1.0000 1.0000 59.0000 100.0000 2.7500 0.2500
4.0000 1.0000 1.0000 55.0000 100.0000 3.0000 0.2500
4.0000 1.0000 1.0000 56.0000 100.0000 3.2500 0.2500
4.0000 1.0000 1.0000 60.0000 100.0000 3.5000 0.2500
5.0000 1.0000 1.0000 53.0000 100.0000 3.7500 0.2500
5.0000 1.0000 1.0000 54.0000 100.0000 4.0000 0.2500
5.0000 1.0000 1.0000 59.0000 100.0000 4.2500 0.2500
6.0000 1.0000 1.0000 53.0000 100.0000 4.5000 0.2500
6.0000 1.0000 1.0000 56.0000 100.0000 4.7500 0.2500
6.0000 1.0000 1.0000 58.0000 100.0000 5.0000 0.2500
7.0000 1.0000 1.0000 58.0000 100.0000 5.2500 0.2500
7.0000 1.0000 1.0000 60.0000 100.0000 5.5000 0.2500
7.0000 1.0000 1.0000 65.0000 100.0000 5.7500 0.2500
8.0000 1.0000 1.0000 53.0000 100.0000 6.0000 0.2500
8.0000 1.0000 1.0000 54.0000 100.0000 6.2500 0.2500
8.0000 1.0000 1.0000 63.0000 100.0000 6.5000 0.2500
9.0000 1.0000 1.0000 61.0000 100.0000 6.7500 0.2500
9.0000 1.0000 1.0000 62.0000 100.0000 7.0000 0.2500
9.0000 1.0000 1.0000 65.0000 100.0000 7.2500 0.2500
等...
对于每个z(代码中前面已经规定了z的值)行,我想要在它们下面逐字插入3行副本,如下所示(在本例中z = 3):
0 1.0000 1.0000 60.0000 100.0000 0 0.2500
0 1.0000 1.0000 62.0000 100.0000 0.2500 0.2500
0 1.0000 1.0000 63.0000 100.0000 0.5000 0.2500
0 1.0000 1.0000 60.0000 100.0000 0 0.2500
0 1.0000 1.0000 62.0000 100.0000 0.2500 0.2500
0 1.0000 1.0000 63.0000 100.0000 0.5000 0.2500
0 1.0000 1.0000 60.0000 100.0000 0 0.2500
0 1.0000 1.0000 62.0000 100.0000 0.2500 0.2500
0 1.0000 1.0000 63.0000 100.0000 0.5000 0.2500
0 1.0000 1.0000 60.0000 100.0000 0 0.2500
0 1.0000 1.0000 62.0000 100.0000 0.2500 0.2500
0 1.0000 1.0000 63.0000 100.0000 0.5000 0.2500
1.0000 1.0000 1.0000 58.0000 100.0000 0.7500 0.2500
1.0000 1.0000 1.0000 59.0000 100.0000 1.0000 0.2500
1.0000 1.0000 1.0000 65.0000 100.0000 1.2500 0.2500
1.0000 1.0000 1.0000 58.0000 100.0000 0.7500 0.2500
1.0000 1.0000 1.0000 59.0000 100.0000 1.0000 0.2500
1.0000 1.0000 1.0000 65.0000 100.0000 1.2500 0.2500
1.0000 1.0000 1.0000 58.0000 100.0000 0.7500 0.2500
1.0000 1.0000 1.0000 59.0000 100.0000 1.0000 0.2500
1.0000 1.0000 1.0000 65.0000 100.0000 1.2500 0.2500
1.0000 1.0000 1.0000 58.0000 100.0000 0.7500 0.2500
1.0000 1.0000 1.0000 59.0000 100.0000 1.0000 0.2500
1.0000 1.0000 1.0000 65.0000 100.0000 1.2500 0.2500
等
接下来我想要替换第1列,现在有了模式
[0 0 0 5 5 5 10 11 12 17 17 17 ]
然后重复(总是从5个整数后来,直到模式结束,以便接下来的12个条目:
[22 22 22 27 27 27 32 33 34 39 39 39]
等等。
如果代码相对愚蠢友好(我友好),那将是很好的 如果需要,我可以轻松地操纵这个重复模式。例如,如果z 是4而不是3然后我想要模式
[0 0 0 0 5 5 5 5 10 11 12 13 18 18 18 18]
...然后应将第6列替换为与列相关的列 1(a)(column_1 * 0.25)关系。 即对于上述样本,其中第1列是:
[0 0 0 5 5 5 10 11 12 17 17 17 22 22 22 27 27 27 32 33 34 39 39 39]
第6列将是:
[0 0 0 1.2500 1.2500 1.2500 2.5000 2.7500 3.0000 4.2500 4.2500 4.2500 5.5000
5.5000 5.5000 6.7500 6.7500 6.7500 8.0000 8.2500 8.5000 9.7500 9.7500
9.7500]
你可以帮忙吗?非常感谢提前
答案 0 :(得分:2)
对于reshape和repmat,第一部分至少看起来不错。 棘手的部分是不要弄乱尺寸。 另一种方法是使用单元格和函数cellfun。
在这个答案中,我将使用如下定义的玩具示例:
[~,ArrayIn]=meshgrid(1:7,1:20);
ArrayIn =
1 1 1 1 1 1 1
2 2 2 2 2 2 2
3 3 3 3 3 3 3
.....
z=3;
repmat
和reshape
: 现在,基本上,代码将运行3个主要步骤:
第1步:重塑矩阵,使其成为大小为size(ArrayIn,2)xzxsize(ArrayIn,1)/z
的矩阵
reshapedArrayIn=reshape(ArrayIn.',size(ArrayIn,2),z,[]);
请注意,在此步骤之后,沿第3维的切片正好是要重复3次的长度为z
的切片(只有它们被转置,但由于重塑的方式,它是必需的)
reshapedArrayIn =
ans(:,:,1) =
1 2 3
1 2 3
1 2 3
1 2 3
1 2 3
1 2 3
1 2 3
ans(:,:,2) =
4 5 6
4 5 6
4 5 6
4 5 6
4 5 6
4 5 6
4 5 6
...
另请注意,如果您的矩阵中的行数在z
处不可分割,则代码将失败,您必须在调用reshape
之前添加额外的行为了它的工作:
% Optional
if mod(size(ArrayIn,1),z)~=0
ArrayIn=[ArrayIn;zeros(z-mod(size(ArrayIn,1),z),size(ArrayIn,2))];
end
第2步:沿第二维重复矩阵3次
repArray=repmat(reshapedArrayIn,1,3,1);
第3步:重新整形矩阵以获得2维矩阵,转换结果以使其正确
ArrayOut=reshape(repArray,size(ArrayIn,2),size(ArrayIn,1)*3).';
结果符合预期:
ArrayOut =
1 1 1 1 1 1 1
2 2 2 2 2 2 2
3 3 3 3 3 3 3
1 1 1 1 1 1 1
2 2 2 2 2 2 2
3 3 3 3 3 3 3
...
cellfun
实现这一目标的另一种可能性是将矩阵转换为单元格,然后在所有子单元格上使用函数cellfun(此代码将在ArrayIn
填充后进行,以便其编号为行可以z
:
Idy=7;
Idx=z*ones(size(ArrayIn,1)/z,1);
ArrayCell=mat2cell(ArrayIn,Idx,Idy);
CellOut=cellfun(@(A) repmat(A,3,1),ArrayCell,'UniformOutput',false);
ArrayOut=cell2mat(CellOut);
给出预期的结果:
ArrayOut =
1 1 1 1 1 1 1
2 2 2 2 2 2 2
3 3 3 3 3 3 3
1 1 1 1 1 1 1
2 2 2 2 2 2 2
3 3 3 3 3 3 3
...
对于本部分,您可以使用@tim在评论中给出的内容,但稍作修改即可将列的长度考虑在内:
A = [zeros(1,z) 5*ones(1,z) 10:(9+z) 17*ones(1,z)];
m=ceil(size(ArrayOut,1)/(4*z));
UncutCol=repmat(A.',1,m)+repmat(22(*0:(m-1)),length(A),1);
Column1Out=UncutCol(1:size(ArrayOut,1));
Column6Out=Column1Out*0.25;
ArrayOut(:,1)=Column1Out;
ArrayOut(:,6)=Column6Out;
方法1:
z=3;
[~,ArrayIn]=meshgrid(1:7,1:20);
if mod(size(ArrayIn,1),z)~=0
ArrayIn=[ArrayIn;zeros(z-mod(size(ArrayIn,1),z),size(ArrayIn,2))];
end
reshapedArrayIn=reshape(ArrayIn.',size(ArrayIn,2),z,[]);
repArray=repmat(reshapedArrayIn,1,3,1);
ArrayOut=reshape(repArray,size(ArrayIn,2),size(ArrayIn,1)*3).';
A = [zeros(1,z) 5*ones(1,z) 10:(9+z) 17*ones(1,z)];
m=ceil(size(ArrayOut,1)/(4*z));
UncutCol=repmat(A.',1,m)+repmat(22*(0:(m-1)),length(A),1);
Column1Out=UncutCol(1:size(ArrayOut,1));
Column6Out=Column1Out*0.25;
ArrayOut(:,1)=Column1Out;
ArrayOut(:,6)=Column6Out;
方法2:
z=3;
[~,ArrayIn]=meshgrid(1:7,1:20);
if mod(size(ArrayIn,1),z)~=0
ArrayIn=[ArrayIn;zeros(z-mod(size(ArrayIn,1),z),size(ArrayIn,2))];
end
Idy=7;
Idx=z*ones(size(ArrayIn,1)/z,1);
ArrayCell=mat2cell(ArrayIn,Idx,Idy);
CellOut=cellfun(@(A) repmat(A,3,1),ArrayCell,'UniformOutput',false);
ArrayOut=cell2mat(CellOut);
A = [zeros(1,z) 5*ones(1,z) 10:(9+z) 17*ones(1,z)];
m=ceil(size(ArrayOut,1)/(4*z));
UncutCol=repmat(A.',1,m)+repmat(22*(0:(m-1)),length(A),1);
Column1Out=UncutCol(1:size(ArrayOut,1));
Column6Out=Column1Out*0.25;
ArrayOut(:,1)=Column1Out;
ArrayOut(:,6)=Column6Out;
ArrayOut = 0 1.0000 1.0000 1.0000 1.0000 0 1.0000 0 2.0000 2.0000 2.0000 2.0000 0 2.0000 0 3.0000 3.0000 3.0000 3.0000 0 3.0000 5.0000 1.0000 1.0000 1.0000 1.0000 1.2500 1.0000 5.0000 2.0000 2.0000 2.0000 2.0000 1.2500 2.0000 5.0000 3.0000 3.0000 3.0000 3.0000 1.2500 3.0000 10.0000 1.0000 1.0000 1.0000 1.0000 2.5000 1.0000 11.0000 2.0000 2.0000 2.0000 2.0000 2.7500 2.0000 12.0000 3.0000 3.0000 3.0000 3.0000 3.0000 3.0000 17.0000 4.0000 4.0000 4.0000 4.0000 4.2500 4.0000 17.0000 5.0000 5.0000 5.0000 5.0000 4.2500 5.0000 17.0000 6.0000 6.0000 6.0000 6.0000 4.2500 6.0000 22.0000 4.0000 4.0000 4.0000 4.0000 5.5000 4.0000 22.0000 5.0000 5.0000 5.0000 5.0000 5.5000 5.0000 22.0000 6.0000 6.0000 6.0000 6.0000 5.5000 6.0000 .....
答案 1 :(得分:0)
我还想提供第二种解决方案,您需要知道的所有内容都作为评论提供:
%%% INPUT DATA %%%
N = 3;
[~, A]=meshgrid(1:7,1:21);
numRows = size(A, 1);
if(mod(numRows, N) ~= 0)
% do padding here so that numRows can be devided by N, you can do it yourself :-)
end
%%% FIRST PART %%%
cnt = reshape(1:numRows,[N, numRows/N]) % create matrix which contains indices 1:numRows (number of Rows of A) in the desired manner
idx = repmat(cnt, N+1, 1) % number of copies of every line you want: N (so you'd have N+1 entries of every row (1 base and N copies))
A_cop = A(idx(:), :) % now idx(:) will give you the row-indices to replicate the rows of A in the desired manner
% --> 3-liner :-) could even be summed up in one single codeline :D
%%% SECOND PART %%%
c = [zeros(1,N) 5*ones(1,N) 10:(9+N) 17*ones(1,N)]; % base format
c2 = repmat(c', 1, ceil(size(A_cop, 1)/length(c))); % replicate it so that +i*22 can be added easily column-wise (i=column index)
c3 = bsxfun(@plus, c2, [(0:(size(c2,2)-1))]*22);
firstCol = c3(:); % linearize column-major memory
%%% THIRD PART -> merge both parts %%%
A_cop(:, 1) = firstCol(1:size(A_cop,1)); % set first column
A_cop(:, 6) = A_cop(:, 1)*0.25;
我认为我的第一部分可能比Bill更容易理解,不是吗?
我使用索引来复制输入矩阵A
中的行。这意味着,我生成一个向量,其中包含我想从A中获取的行索引,并且此向量可以包含多次值。
我的示例index-vector如下所示:
>> idx(:)
ans =
1
2
3
1
2
3
1
2
3
1
2
3
4
5
6
4
5
6
4
5
6
4
5
6
7
8
9
...
使用这个,我制作最终矩阵A_cop
,然后我在评论中应用第二部分 - >在矩阵中复制基本格式c
并在第i列中求和+ i * 22,然后线性化内存以产生一个行向量: - )