我有一个 5 -by- 200 矩阵,其中i:50:200
,i=1:50
彼此相关,所以例如矩阵列1
,51
,101
,151
彼此相关,列49
,99
,149
, 199
也相互关联。
我想使用for
- 循环创建另一个矩阵,根据此关系重新排序前一个矩阵。
我的代码是
values=zeros(5,200);
for j=1:50
for m=1:4:200
a=factor_mat(:,j:50:200)
values(:,m)=a
end
end
但是,代码不起作用。
答案 0 :(得分:2)
这是发生了什么。假设我们在外循环的第一次迭代中,所以j == 1
。这有效地为您提供:
j = 1;
for m=1:4:200
a=factor_mat(:,j:50:200)
values(:,m)=a;
end
因此,您要为a
创建相同的子矩阵(j
不会更改)50次并将其存储在values
矩阵中的不同位置。这不是你想要做的。
要创建每个4列子矩阵并将其存储在50个不同的位置,您需要使用j
告诉您当前处理的50个子列中的哪一个:
for j=1:50
a=factor_mat(:,j:50:200);
m=j*4; %// This gives us the **end** of the current range
values(:,m-3:m)=a;
end
我在这里使用了一个小技巧,因为Matlab数组的索引从1开始而不是0.我计算了我们要插入的 last 列的索引。对于第一组,这是第4列。自j == 1
,j * 4 == 4
。然后我减去3以找到第一列索引。
这将解决你的循环问题。但循环不是很Matlab-ish。他们过去很慢;现在他们已经足够了。但他们仍然不是很酷的做事方式。
要在没有循环的情况下执行此操作,您可以使用reshape
和permute
:
a=reshape(factor_mat,[],50,4);
b=permute(a,[1,3,2]);
values=reshape(b,[],200);