【问题标题】:How to generate all the vectors between two given m-tuple vectors?如何生成两个给定 m 元组向量之间的所有向量?
【发布时间】:2017-11-14 01:14:48
【问题描述】:

假设我们有两个向量:
A=(a₁,a2,...,aₘ)和 B=(b₁,b₂,...,bₘ)
我们需要为这两个向量之间的所有向量做点什么。

例如对于A=(1,1,0)和B=(1,2,2),A和B之间的所有向量都是:{(1,1,1),(1,1, 2),(1,2,0),(1,2,1)}.

生成此类向量的一种明显方法是使用 m 循环(for 循环),但它可能不是最好的方法。我想知道是否有人有更好的主意。

【问题讨论】:

  • 如您所见,没有 TEX 支持。 Cosnider 添加方程的图像或用不同的格式编写它们
  • @AnderBiguri 谢谢。我做了一些更正。在这里问这样的问题合适吗?
  • 我不明白你所说的“一种明显的方式”是什么意思,因为它不适合我。实际上,您所说的“为这两个向量之间的所有向量做一些事情”是什么意思。任何算法与您的问题相关联?
  • @Y.Chang 假设您需要生成 A = (1, 1) 和 B = (2, 3) 之间的向量。在这种情况下,使用 for 循环,您可以将代码编写为 for i=1:2 for j=1:3 .... end end。这就是我所说的生成此类向量的明显方法的意思。
  • @Y.Chang “做某事......”我的意思是我需要对这些向量进行一些计算。事实上,以比使用 for 循环更有效的方式生成向量对我来说很重要。

标签: arrays matlab vector


【解决方案1】:

这是一个固定的方法。返回一个矩阵,其中每一行都是结果的向量之一。

% Data
A = [0, 0, 1, 3, 5, 2]
B = [4, 8, 5, 7, 9, 6]

% Preallocate
b = cell(1,numel(A));
vec = cell(1,numel(A));

% Make a vector of values of each element of the result
for i = 1:numel(A)
    vec{i} = A(i):B(i);
end

% Get all combinations using ndgrid
[b{:}] = ndgrid(vec{:});
b=cat(ndims(b{1})+1,b{:});

% Reshape the numel(A)+1 dimensional array into a 2D array
res = reshape(b,numel(b)/length(A),length(A));

【讨论】:

  • 感谢您的回答大卫。但是,我认为这对于一个非常特殊的情况是有好处的。例如,我认为如果我将 A 更改为 A = [2, 3, 5],那么您的方法不会得出正确的解决方案。实际上,据我了解,当向量中的所有实体都相同并且向量 A 和 B 中的实体之间的距离为一时,您的方法给出了正确的答案。您对生成例如 A =(0, 0, 1, 3, 5, 2) 和 B = (4, 8, 5, 7, 9, 6) 之间的向量有什么想法吗?
  • 我想我修好了。
  • 再次感谢您的尝试。我认为您提出的技术有些问题。我尝试了 A = [0, 1, 1] 和 B = [1, 1, 3] 并获得以下解决方案 0 0 0, 1 1 1, 1 1 1, 1 1 1, 1 2 3, 1 2 3,这不是正确的解决方案。我试图找出问题所在。顺便说一句,这似乎是非常好的技术。我很感激。
  • 将 cell2mat 行替换为:b=cat(ndims(b{1})+1,b{:});
  • @David 根据 Jed 的建议,您可以编辑您的解决方案以使其完整。
猜你喜欢
  • 2013-02-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-18
相关资源
最近更新 更多