我有一个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,这已经在双循环中嵌入了。
由于
编辑:为了清晰起见,在代码中添加了评论。
编辑:纠正了可能结果的错误
答案 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