algorithm - 具有数学公式的 MATLAB 中的相邻元素

标签 algorithm matlab math combinatorics

我有一套 N = {1,2,3,4n=4元素和可能的相邻组合是:

{empty set} {1} {2} {3} {4} {1,2} {2,3} {3,4} {1,2,3} {2,3,4} and {1,2,3,4}

所以总共可能的组合是c=11,可以用公式计算:

c=(n^2/2)+(n/2)+1

我可以使用 A = n X c 对其进行建模其元素可以表示为 a(n,c) 的如下:

Matrix A

我曾尝试在 MATLAB 中实现它,但由于我已经对上述数学进行了硬编码,因此对于 n > 4 的情况,我的代码不可扩展:

n=4;
c=((n^2)/2)+(n/2)+1;
A=zeros(n,c); 

for i=1:n 
    A(i,i+1)=1; 
end 

for i=1:n-1 
    A(i,n+i+1)=1;
    A(i+1,n+i+1)=1;
end 

for i=1:n-2 
    A(i,n+i+4)=1;
    A(i+1,n+i+4)=1;
    A(i+2,n+i+4)=1; 
end 

for i=1:n-3 
    A(i,n+i+6)=1;
    A(i+1,n+i+6)=1;
    A(i+2,n+i+6)=1;
    A(i+3,n+i+6)=1;
end

在 MATLAB 中,是否有一个复杂度相对较低的方法,按照我上面的数学公式,用集合 Nn 个元素来转换这个问题?

最佳答案

解决此问题的简单方法是采用前 k 位设置的位模式并将其向下移动 n - k 次,保存每个移位的列向量结果。所以,从

开始
1
0
0
0

移位1、2、3次得到

|1 0 0 0|
|0 1 0 0|
|0 0 1 0|
|0 0 0 1|

我们将使用 circshift实现这一目标。

function A = adjcombs(n)
   c = (n^2 + n)/2 + 1;   % number of combinations
   A = zeros(n,c);        % preallocate output array 

   col_idx = 1;             % skip the first (all-zero) column 
   curr_col = zeros(n,1);   % column vector containing current combination
   for elem_count = 1:n
      curr_col(elem_count) = 1;   % add another element to our combination
      for shift_count = 0:(n - elem_count)
         col_idx = col_idx + 1;   % increment column index 
         % shift the current column and insert it at the proper index
         A(:,col_idx) = circshift(curr_col, shift_count);
      end
   end
end

使用 n = 4 和 6 调用函数,我们得到:

>> A = adjcombs(4)
A =

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

>> A = adjcombs(6)
A =

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

关于algorithm - 具有数学公式的 MATLAB 中的相邻元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41721694/

相关文章:

java - Java 中的快速内存操作?

c - 如何将两个参数及其大小传递给 Matlab 中的 C 函数?

python - 如何在python中生成没有重复字符的组合?

algorithm - 如何获得这样的特定序列?

基于关键词交集的匹配算法

algorithm - CIElab 混色与 alpha

algorithm - 为什么用 Big O 表示法而不是 Theta 给出算法复杂度?

python - 为什么在求解稀疏线性方程组时会出现内存错误?

c - 在 Linux 中将 MATLAB 输出与 C/C++ 程序集成

c++ - 在 8 Puzzle | 中寻找曼哈顿距离的目标坐标C++