如何在MATLAB中将给定索引设置为$ 1 $?

时间:2015-12-18 01:38:10

标签: matlab optimization

我有以下代码行来创建排列矩阵。

 R=zeros(N^2,N^2);
 R1=randperm(N^2);
 for j=1:N^2
     R(j,R1(j))=1;
 end

有更快的方法吗?

1 个答案:

答案 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;