改变具有小约束的矩阵的随机元素

时间:2014-07-11 00:45:22

标签: arrays matlab random vector matrix

我有一个Vector 1xm,ShortMemory(SM)和一个Matrix nxm,Agenda(AG)。 SM只有正整数和零。 AG的每列只有一个元素等于1,同一列的所有其他元素都等于0。

我的目标是从AG的随机选择列中更改数字1的位置。问题是只能更改SM中对应0的列。

示例:

SM = [1 0 2];
AG = [1 1 0 ; 0 0 1 ; 0 0 0];

此处随机生成的数字

RandomColumn = 2;

可能的结果将是

AG = [1 0 0 ; 0 1 1 ; 0 0 0]; or AG = [1 0 0; 0 0 1 ; 0 1 0]; or AG = [1 1 0 ; 0 0 1 ; 0 0 0];

获得1的Line也是随机的,但这很容易做到

我可以通过获得介于1和m之间的随机数来实现,但是m在我的问题中可能非常大,并且零的数量也可能非常小,因此可能需要很多时间。我也可以用一个循环来做,但它是Matlab,这已经在双循环中嵌入了。

由于

编辑:为了清晰起见,在代码中添加了评论。

编辑:纠正了可能结果的错误

1 个答案:

答案 0 :(得分:3)

我的解决方案基于以下假设:

  1. 目标是从AG随机选择的列中更改数字1的位置。
  2. 只能更改SM中对应0的列。
  3. 解决方案:

    % input
    SM = [1 0 2]
    AG = [1 1 0 ; 0 0 1 ; 0 0 0]
    
    % generating random column according to assumptions 1 and 2
    RandomColumn1 = 1:size(AG,2);
    RandomColumn1(SM~=0)=[];
    RandomColumn1=RandomColumn1(randperm(length(RandomColumn1)));
    RandomColumn=RandomColumn1(1);
    
    % storing the current randomly chosen column before changing
    tempColumn=AG(:,RandomColumn);
    
    % shuffling the position of 1
    AG(:,RandomColumn)=AG(randperm(size(AG,1)),RandomColumn);
    
    % following checks if the column has remained same after shuffling. This while loop should execute (extremely) rarely.
    while tempColumn==AG(:,RandomColumn)
       tempColumn=AG(:,RandomColumn);
       AG(:,RandomColumn)=AG(randperm(size(AG,1)),RandomColumn);
    end
    AG