我有以下代码行来创建排列矩阵。
R=zeros(N^2,N^2);
R1=randperm(N^2);
for j=1:N^2
R(j,R1(j))=1;
end
有更快的方法吗?
答案 0 :(得分:1)
您可以像这样使用linear indexing:
N = 3;
R = zeros(N^2);
R(randperm(N^2) + (0:N^2:(N^4-N^2))) = 1;
这是有效的,因为N^2+1
是第二列中的第一个元素,2*N^2+4
是第三列中的第四个元素等。
让我们定义M = N^2
以使解释更简单。现在,0:M:(M^2-M)
创建了一个矩阵[0 M 2*M 3*M ... (M-1)*M]
。添加R1
即可获得包含元素[R1(1), M+R1(2) 2*M+R1(3) ... (M-1)*M+R1(M)]
的向量。如果您将这些数字用作索引,则第一个数字将对应于第一列中的行R1(1)
,第二个数字将对应于第二列中的R1(2)
等。
现在,您可以在这些位置为1
矩阵指定值R
。您可能希望查看函数ind2sub
以了解其工作原理。 ind2sub
将线性索引转换为“正常”[rows cols]
索引样式。
pos = randperm(M)+(0:M:(M^2-M))
pos =
1 15 26 31 38 54 59 70 75
[row, col] = ind2sub(size(R), pos)
row =
1 6 8 4 2 9 5 7 3
col =
1 2 3 4 5 6 7 8 9
如果您需要其他地方的R1
变量,您当然可以这样做:
R = zeros(N^2);
R1 = randperm(N^2)
R(R1 + (0:N^2:(N^4-N^2))) = 1;