【问题标题】:generating distanced matrix for an n-dimensional hypercube为 n 维超立方体生成距离矩阵
【发布时间】:2012-04-22 01:12:29
【问题描述】:

是否有任何算法或方法可以为任何维度的超立方体生成邻接矩阵?假设您的输入是 5,它将创建一个 5 维超立方体

我能找到的都是来自 wiki

wolfram

【问题讨论】:

  • “生成 5 维超立方体”是什么意思?需要生成哪些数据?
  • 好吧,我必须设置 n 维超立方体,然后获取它的邻接矩阵(一旦我设置好它并不难),然后做一些特征值和线性代数分析邻接矩阵
  • 好的。那么你绝对应该编辑你的问题,说它是你所追求的邻接矩阵。此外,C 和 Matlab 是非常不同的语言。你对哪一个感兴趣?
  • 你在编辑方面击败了我 xD 谢谢,是的,我可以很容易地使用 c 或 matlab,所以这就是我放这些的原因

标签: c matlab multidimensional-array


【解决方案1】:

如果要生成 N 维单位超立方体的顶点,基本上可以制作 N 值真值表。这是我使用的一些代码:

function output = ttable(values)

  output = feval(@(y)feval(@(x)mod(ceil(repmat((1:x(1))', 1, numel(x) - 1) ./ repmat(x(2:end), x(1), 1)) - 1, repmat(fliplr(y), x(1), 1)) + 1, fliplr([1 cumprod(y)])), fliplr(values));
end

要获得 5-D 超立方体的顶点,您可以这样称呼它:

vertices = ttable(ones(1, 5) * 2) - 1;

从这里您可以通过查找所有仅相差一位的顶点来计算邻接矩阵,即:

adj_list = zeros(2^5, 5);
adj_mat = zeros(2^5, 2^5);
for v=1:2^5
  L1_dists = sum(abs(vertices - repmat(vertices(v, :), 2^5, 1)), 2);
  adj_list(v, :) = find(L1_dists == 1);
  adj_mat(v, find(L1_dists == 1)) = 1;
end

【讨论】:

  • 这非常好,感谢您更进一步
  • 我得到全 0 的结果?我会试着找出原因
  • L1_dists = sum(vertices - repmat(vertices(v, :), 2^5, 1), 2);这行给了我一个错误
  • 上面的行应该是L1_dists = sum(adj_mat- repmat(vertices(v, :), 2^5, 1), 2);吗?
  • 我很确定其余的都是正确的——它对我有用。您是否复制了ttable 函数并运行vertices = ttable(ones(1, 5)*2)-1
最近更新 更多