Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在matlab中生成具有特定条件的随机二进制矩阵?_Matlab_Function_Matrix_Random - Fatal编程技术网

如何在matlab中生成具有特定条件的随机二进制矩阵?

如何在matlab中生成具有特定条件的随机二进制矩阵?,matlab,function,matrix,random,Matlab,Function,Matrix,Random,如果矩阵A表示G(n,m)矩阵中的一组数 G = [ 1 1 0 0 1 0 1 1 1 0 1 0 1 1 1 ] 那么矩阵的 A = [ 2 1 3 0 1 3 ] 然后我想生成(n,m)个随机矩阵,这个矩阵中的那些随机矩阵依赖于A,它们的出现顺序相同 一个解决办法是 x = [ 0 1 1 0 1 0 0 1 1 1 1 0 1 1 1 ] 另一个解决方案 x = [ 1 1 0 1 0 1 1

如果矩阵A表示G(n,m)矩阵中的一组数

G = [ 1 1 0 0 1 
      0 1 1 1 0
      1 0 1 1 1 ] 
那么矩阵的

A = [ 2 1
      3 0
      1 3 ]
然后我想生成(n,m)个随机矩阵,这个矩阵中的那些随机矩阵依赖于A,它们的出现顺序相同

一个解决办法是

x = [ 0 1 1 0 1
      0 0 1 1 1
      1 0 1 1 1 ]
另一个解决方案

x = [ 1 1 0 1 0
      1 1 1 0 0
      1 0 1 1 1 ]

正如OP评论中提到的,StackOverflow不是一种代码编写服务。话虽如此,这是一个有趣的问题,我决定破例回答它

撇开手续不谈


我想我有一个通用的解决方案,它也可以处理一些(全部?)边缘情况,如零行的
G
等。下面的代码生成了
x
矩阵的一个实例

创建这些
x
s的
n
-by-
m
数组留给读者“作为练习”(主要是因为OP希望它是矩阵的单元数组还是4-D逻辑/双数组还没有定义)

要了解它的作用,请参见代码+变量名中的注释。我希望它足够清楚(并且我没有遗漏任何边缘案例)

函数x=q37055681(G)
%%输入
如果nargin<1
G=[11 0 1
0 1 1 1 0
1 0 1 1 1 ];
结束
%%输入分析:
[A_ROWS,OUT_COLS]=尺寸(G);
转换=查找(diff(padarray(G',1,false,'both'),1,2);
tr_per_ln=hist(细胞(转变/(大小(G,2)+1)),大小(G,1))/2;
A_COLS=最大值(tr_/ln);
缺少每行的传输=A列-每行的传输;
一组一组=差异(重塑(转变,2,[]),1,1);%忽略0的RLE的结果
%根据外部定义计算“修复”,即每个组仅处理1个组
%行(在本例中,在A的第一个元素中计数):
insrt=@(what,into,where)cat(2,into(1:where-1),what,into(where:end));
对于indZ=1:sum(每行缺少传输(:)
next_complete=查找(每行缺少_trans_,1);
一组中的一组=insrt(0,一组中的一组,A列*下一个不完整-。。。
(每行缺少传输(下一个未完成)-1);
每行缺少传输(下一行未完成)=每行缺少传输(下一行未完成)-1;
结束
A=重塑(一组一组,A组[]);
%%产出的产生:
x=零(尺寸(G));
对于indR=1:A_行
令牌=单元(和(A(indR,:)~=0),1);
开关numel(令牌)
案例0
%我们不需要做任何事情,整条线都是0。
继续;
案例1
标记{1}=repelem(true,A(indR,1));
否则
对于indT=1:numel(令牌)-1
标记{indT}=[repelem(true,A(indR,indT))0];
结束
标记{end}=repelem(true,A(indR,find(A(indR,:),1,'last'));
结束
zero_tokens=repmat({0},[OUT_COLS-sum(A(indR,:)-(numel(tokens)-1),1]);
%现在,我们需要构建一个向量,从
%标记或零标记。
单元格_-to_-pick_-from=[one(1,numel(标记))零(1,numel(零标记))];
选择_顺序=单元格_to_pick_from(randperm(numel,单元格_to_pick_from));
%^这里是随机性的来源:
x_线=[];
对于indC=1:numel(选择顺序)
如果选择订单(indC)
%如果为1,请从“令牌”中选择
token=tokens{sum(选择_顺序(1:indC)==1)};
其他的
%如果为0,请从“零”中选择
token=0_tokens{sum(选择_顺序(1:indC)==0)};
结束
x_线=[x_线标记];%#好啊
结束
x(indR,:)=x_线;
结束
结束

为什么有R标签?输入是什么?期望的输出是什么?到目前为止,你尝试了什么?@lmo可能是因为它有
matlab
tag-R的相同原因,matlab和Octave通常用于处理矩阵。我看不出你是如何从
A
G
或反之亦然(以及它们与
x
的关系)。您能提供一个详细的逐步算法,用于从输入生成输出吗?编辑:没关系,我现在看到A在
G
@Crowley的行中计算连续的数,这是否意味着我们应该包括,只是为了安全?不,标签不是用来获取可见性的,它们是用来确定这个特定问题是关于什么的。搜索如何在R中生成随机二进制矩阵的人不希望看到一个专门针对MATLAB的问题和专门针对MATLAB的答案。
function x = q37055681(G)
  %% Input
  if nargin < 1
    G = [ 1 1 0 0 1
          0 1 1 1 0
          1 0 1 1 1 ];
  end
  %% Input analysis:
  [A_ROWS,OUT_COLS] = size(G);
  transitions = find(diff(padarray(G.',1,false,'both').',1,2).');
  tr_per_ln = hist(ceil(transitions/(size(G,2)+1)),size(G,1))/2;
  A_COLS = max(tr_per_ln);
  missing_trans_per_line = A_COLS - tr_per_ln;
  groups_of_ones = diff(reshape(transitions,2,[]),1,1); % < result of RLE which ignores 0's
  % Count "fixing" based on the external definition of what to do with only 1 group per 
  % line (in this case, count it in the first element of A): 
  insrt = @(what, into, where) cat(2, into(1:where-1), what, into(where:end));
  for indZ = 1:sum(missing_trans_per_line(:))
    next_incomplete = find(missing_trans_per_line,1);
    groups_of_ones = insrt(0, groups_of_ones, A_COLS*next_incomplete-...
                                (missing_trans_per_line(next_incomplete)-1));
    missing_trans_per_line(next_incomplete) = missing_trans_per_line(next_incomplete)-1;
  end
  A = reshape(groups_of_ones,A_COLS,[]).';
  %% Generation of output:
  x = zeros(size(G));
  for indR = 1:A_ROWS
    tokens = cell(sum(A(indR,:)~=0),1);
    switch numel(tokens)
      case 0
        % we don't need to do anything, the entire line is 0.
        continue;
      case 1
        tokens{1} = repelem(true,A(indR,1));
      otherwise
        for indT = 1:numel(tokens)-1
          tokens{indT} = [repelem(true,A(indR,indT)) 0];
        end
        tokens{end} = repelem(true,A(indR,find(A(indR,:),1,'last')));
    end
    zero_tokens = repmat({0},[OUT_COLS-sum(A(indR,:))-(numel(tokens)-1),1]);  
    % Now we need to build a vector that selects randomly but SEQUENTIALLY from 
    % EITHER tokens or zero_tokens. 
    cell_to_pick_from = [ones(1,numel(tokens)) zeros(1,numel(zero_tokens))];
    choosing_order = cell_to_pick_from(randperm(numel(cell_to_pick_from)));
    % ^ Here's where the randomness comes in:
    x_line = [];
    for indC = 1:numel(choosing_order)
      if choosing_order(indC)
        % if it's 1, choose from "tokens"
        token = tokens{sum(choosing_order(1:indC)==1)};
      else
        % if it's 0, choose from "zeros"
        token = zero_tokens{sum(choosing_order(1:indC)==0)};
      end
      x_line = [x_line token]; %#ok
    end
    x(indR,:) = x_line;
  end
end