【问题标题】:Adjacent Elements in MATLAB with Mathematical FormulationMATLAB 中的相邻元素与数学公式
【发布时间】:2017-01-18 14:13:04
【问题描述】:

我有一组 和 元素,可能的相邻组合是:

所以可能的组合总数为 c=11,可以使用以下公式计算:

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

我曾尝试在 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 中有 n 个元素集合 N 的元素,是否有相对较低复杂度的方法来转换这个问题?

【问题讨论】:

  • 您的实际问题是什么?看起来您已经有了解决方案,不是吗?
  • 你是在问这将如何扩展到其他任意集合?
  • 是的,我已经有了解决方案,但我是 MATLAB 新手,我想在 MATLAB 中将它作为算法编程。我该如何编程?
  • 您首先需要弄清楚如何将其扩展到其他任意集合(无需 Matlab)。我想我知道这将如何概括,但并不完全清楚(尤其是可能的相邻组合的排序)。
  • 在上面的例子和下面的 MATLAB 代码中,我在 n=4 的情况下完成了它。但我想对任何 n 个元素都这样做。我的代码不适用于 n 个元素。如果您建议我如何对任何数字 n 执行此操作,您将不胜感激。MATLAB 代码:clc n=4; c=((n^2)/2)+(n/2)+1; A=零(n,c);对于 i=1:n A(i,i+1)=1;结束 i=1:n-1 A(i,n+i+1)=1; A(i+1,n+i+1)=1;结束 i=1:n-2 A(i,n+i+4)=1; A(i+1,n+i+4)=1; A(i+2,n+i+4)=1;结束 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;结束

标签: algorithm matlab math combinatorics


【解决方案1】:

解决此问题的简单方法是采用设置第一个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 and 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

【讨论】:

  • 我刚刚编辑了 OP 的问题以包含他放入 cmets 的代码,但您似乎已经为 OP 的问题提供了完整的解决方案。我不知道他为什么不接受你的回答。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-03
  • 2019-11-27
  • 2013-08-27
  • 2023-03-10
  • 1970-01-01
相关资源
最近更新 更多