Matlab - 基于某些条件的混洗矩阵值

时间:2016-08-09 10:46:52

标签: matlab matrix

我有以下两个矩阵,它们是程序的输出。矩阵的大小可能会发生变化,但两个矩阵的大小始终相同:size(TwoHopMat_1) == size(Final_matrix)

示例:

TwoHopMat_1 =

     0     0     0     0     1
     0     0     1     1     0
     0     1     0     1     0
     0     1     1     0     0
     1     0     0     0     0


Final_matrix =

 1     0     0     0     1
 1     0     0     0     1
 1     0     0     0     1
 1     1     0     0     0
 1     0     0     0     1

现在我需要洗牌final_matrix以便在洗牌后满足以下条件:

  1. 每列应至少有一个1s
  2. 如果我在TwoHopMat_1的特定位置有1,那么该特定位置在洗牌后不应该为1。
  3. 即使我们给出大小为100x100的矩阵,条件也应该有效。

2 个答案:

答案 0 :(得分:0)

可能的解决方案:

function [result_matrix] = shuffle_matrix(TwoHopMat_1, Final_matrix)

  % Condition number 2
  ones_mat = ones(size(TwoHopMat_1));
  temp_mat = abs(TwoHopMat_1 - ones_mat);

  % Condition number 1
  ones_to_remove = abs(sum(sum(temp_mat)) - sum(sum(Final_matrix)));
  while ones_to_remove > 0
    % Random matrix entry
    i = floor((size(Final_matrix, 1) * rand())) + 1;
    j = floor((size(Final_matrix, 2) * rand())) + 1;

    if temp_mat(i,j) == 1
      temp_mat(i,j) = 0;
      ones_to_remove = ones_to_remove - 1;
    end    
  end
  result_matrix = temp_mat;
end

注意:此解决方案使用蛮力。

答案 1 :(得分:0)

第一步:将结果矩阵的每一列中的一个元素(在Final_matrix中不是1)设置为1

第二步:然后将剩余的那些随机插入结果矩阵的位置,在Final_matrix中不是1并且在第一步结果中不是1

TwoHopMat_1=[...
     0     0     0     0     1
     0     0     1     1     0
     0     1     0     1     0
     0     1     1     0     0
     1     0     0     0     0];
Final_matrix=[...
     1     0     0     0     1
     1     0     0     0     1
     1     0     0     0     1
     1     1     0     0     0
     1     0     0     0     1];
[row col] = size(Final_matrix);
result = zeros(row ,col);
%condition 1 & 2 :
notTwoHop = ~TwoHopMat_1;
s= sum(notTwoHop,1);
c= [0 cumsum(s(1:end - 1))];
f= find(notTwoHop);
r = floor(rand(1, col) .* s) + 1;
i = c + r;
result(f(i)) = 1;
%insert remaining ones randomly into the result
f= find(~(result | TwoHopMat_1));
i = randperm(numel(f), sum(Final_matrix(:))-col);
result(f(i)) =1